La documentación de Swift dice que las clases , estructuras y enumeraciones pueden ajustarse a los protocolos, y puedo llegar a un punto en el que todas se ajustan. Pero no puedo hacer que la enumeración se comporte como los ejemplos de clase y estructura :
protocol ExampleProtocol {
var simpleDescription: String { get set }
mutating func adjust()
}
class SimpleClass: ExampleProtocol {
var simpleDescription: String = "A very simple class."
var anotherProperty: Int = 69105
func adjust() {
simpleDescription += " Now 100% adjusted."
}
}
var a = SimpleClass()
a.adjust()
let aDescription = a.simpleDescription
struct SimpleStructure: ExampleProtocol {
var simpleDescription: String = "A simple structure"
mutating func adjust() {
simpleDescription += " (adjusted)"
}
}
var b = SimpleStructure()
b.adjust()
let bDescription = b.simpleDescription
enum SimpleEnum: ExampleProtocol {
case Base
var simpleDescription: String {
get {
return "A Simple Enum"
}
set {
newValue
}
}
mutating func adjust() {
self.simpleDescription += ", adjusted"
}
}
var c = SimpleEnum.Base
c.adjust()
let cDescription = c.simpleDescription
No he descubierto cómo hacer simpleDescription
que cambie como resultado de la llamada adjust()
. Obviamente, mi ejemplo no hará eso porque el captador tiene un valor codificado, pero ¿cómo puedo establecer un valor para el simpleDescription
mientras todavía se ajusta a ExampleProtocol
?
swift
enums
swift-protocols
Adrian Harris Crowne
fuente
fuente
adjust
función regresaVoid
enExampleProtocol
, es lo mismo que usarmutating func adjust()
. Si deseaadjust
tener un tipo de retorno, puede cambiar el protocolo a: gist.github.com/anjerodesu/e1bf640576a3b6fa415fcase .Base:
Aquí está mi opinión.
Como esto es un
enum
y no unclass
, tienes que pensar diferente (TM) : es tu descripción la que tiene que cambiar cuando el "estado" de tusenum
cambios (como lo señala @ hu-qiang).Espero que ayude.
fuente
Aquí hay otro enfoque, utilizando solo los conocimientos adquiridos durante el recorrido hasta ese momento *
Si desea que
adjust()
actúe como un conmutador (aunque no hay nada que sugiera que este sea el caso), use:* (Aunque no menciona explícitamente cómo especificar un tipo de retorno y un protocolo)
fuente
Aquí hay una solución que no cambia el valor de enumeración actual, sino sus valores de instancia (en caso de que sea útil para alguien).
fuente
self = copy(self, self.desc + ", asdfasdf")
No es posible definir variables sin getter y setter en enums y por lo tanto es imposible tener una variable que pueda modificar.
Puede ajustarse al protocolo pero no puede tener el mismo comportamiento con mutaciones que en las clases.
fuente
Es un enlace sobre enum en swift.
Las estructuras y enumeraciones son tipos de valor. De forma predeterminada, las propiedades de un tipo de valor no se pueden modificar desde sus métodos de instancia.enlace
Entonces, tienes que usar la función de mutación.
fuente
Otra opción es ajustar () para cambiar entre mayúsculas y minúsculas de la siguiente manera:
fuente
Aquí se basa en la respuesta de Jack:
fuente
Se me ocurrió esto
fuente
aquí está mi código
fuente
Mi primera contribución aquí:
¡Gracias por los demás!
fuente
Este experimento también me desconcertó, debido a los ejemplos anteriores de SimpleClass y SimpleStructure que muestran que la propiedad simpleDescription se modifica internamente, lo que me hizo pensar que tenía que hacer lo mismo. Después de revisar las otras respuestas publicadas aquí y leer la documentación oficial de Apple Swift 2.1, se me ocurrió esto:
También observe que en los ejemplos dados por Apple para SimpleClass y SimpleStructure antes de este experimento, la descripción simple se pierde internamente - no puede recuperar el valor original (a menos que, por supuesto, lo guarde fuera de la clase / estructura); esto es lo que me impulsó a crear un método restore () para el ejemplo SimpleEnum, que le permite alternar entre valores. ¡Espero que sea útil para alguien!
fuente
Estaba pensando que el objetivo es simplemente retener el estado y usar una descripción para facilitar la lectura del estado actual:
fuente
Otra variación: usar valores asociados para mantener y mostrar la opción anterior (del formulario "Seleccionado 1, ajustado de 2, ajustado de 1, ajustado de 2, ajustado de 1")
fuente
Qué tal esto
fuente