Comment faire un enum se conformer à un protocole Swift?
Swift documentation dit que classes, les structures, et enums peuvent toutes être conformes aux protocoles, et je peux arriver à un point où ils sont tous conformes. Mais je ne peux pas obtenir le enum à se comporter tout à fait comme les classe et struct exemples:
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
Je n'ai pas compris comment faire pour obtenir l' simpleDescription
à changer suite à l'appel de adjust()
. Mon exemple évidemment de ne pas le faire parce que la getter a une valeur codée en dur, mais comment puis-je définir une valeur pour le simpleDescription
tandis que toujours conformes à la ExampleProtocol
?
Vous devez vous connecter pour publier un commentaire.
C'est ma tentative:
adjust
fonction renvoieVoid
dans leExampleProtocol
, c'est la même chose que d'utilisermutating func adjust()
. Si vous voulezadjust
d'avoir un type de retour, vous pouvez modifier le protocole pour: gist.github.com/anjerodesu/e1bf640576a3b6fa415fcase .Base:
Ici est mon point de vue à elle.
Que c'est un
enum
et pas unclass
, vous devez think different(TM): il est de votre description doit changer lorsque "l'état" de votreenum
changements (comme l'a fait remarquer @hu qiang).Espère que ça aide.
Voici une autre approche, en utilisant seulement les connaissances acquises à partir de la tour jusqu'à ce que le point*
Si vous voulez avoir
adjust()
agir comme un interrupteur à bascule (bien qu'il n'y a rien à suggérer que c'est le cas), l'utilisation:*(Bien que ce ne soit pas explicitement mention de la façon de spécifier un type de retour et un protocole)
Voici une solution qui n'est pas de modifier la valeur d'enum, mais leurs valeurs d'instance de la place (juste au cas où il est utile à personne).
self = copy(self, self.desc + ", asdfasdf")
Il n'est pas possible de définir des variables sans getter et setter dans les énumérations et, par conséquent, il est impossible d'avoir une variable que vous pouvez modifier.
Vous pouvez conformes au protocole, mais vous ne pouvez pas avoir le même comportement avec la mutation que dans les classes.
C'est un lien sur enum swift.
Les Structures et les énumérations sont des types de valeur. Par défaut, les propriétés d'un type de valeur ne peut pas être modifiée à partir de l'intérieur de ses méthodes d'instance. lien
Ensuite, vous devez utiliser la mutation de la fonction.
Est une autre option pour ajuster() pour basculer entre les cas comme suit:
Voici bâtiment sur Jack réponse:
Je suis venu avec cette
voici mon code
Ma première contribution ici:
Merci pour les autres!
Cette expérience m'a jeté aussi, en raison de la précédente SimpleClass et SimpleStructure exemples montrant la propriété simpleDescription être modifiée en interne, ce qui m'a fait penser que je devais faire la même chose. Après avoir regardé dans les autres réponses postées ici et la lecture de l'officiel d'Apple Swift 2.1 documentation, j'ai trouvé ceci:
Également remarquer que, dans les exemples donnés par Apple pour SimpleClass et SimpleStructure avant cette expérience, la simple description est perdu en interne, - vous ne pouvez pas obtenir la valeur d'origine à l'arrière (à moins bien sûr que vous l'enregistrez en dehors de la classe/structure); c'est ce qui m'a incité à créer un restore() méthode pour la SimpleEnum exemple, qui vous permet de basculer d'avant en arrière entre les valeurs. Espérons que cela est utile à quelqu'un!
Je pensais que le but est simplement de retenir de l'état et de l'utilisation d'une description pour que l'état actuel est plus facile à lire:
Une autre variante: à l'Aide de valeurs associées à tenir et affichage de l'option précédente
(de la forme "1, ajusté de 2, ajustée de 1, ajusté de 2, ajustée de 1")
comment à ce sujet