La documentation de Swift dit que les classes , les structures et les énumérations peuvent toutes se conformer aux protocoles, et je peux arriver à un point où elles se conforment toutes. Mais je ne peux pas faire en sorte que l' énumération se comporte comme les exemples de classe et de structure :
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 simpleDescription
changer le à la suite d'un appel adjust()
. Mon exemple ne le fera évidemment pas car le getter a une valeur codée en dur, mais comment puis-je définir une valeur pour le simpleDescription
tout en restant conforme au ExampleProtocol
?
swift
enums
swift-protocols
Adrian Harris Crowne
la source
la source
adjust
fonction retourneVoid
dans leExampleProtocol
, c'est la même chose que d'utilisermutating func adjust()
. Si vous souhaitezadjust
avoir un type de retour, vous pouvez changer le protocole en: gist.github.com/anjerodesu/e1bf640576a3b6fa415fcase .Base:
Voici mon point de vue.
Comme il s'agit d'un
enum
et non d'unclass
, vous devez penser différemment (TM) : c'est votre description qui doit changer lorsque "l'état" de vosenum
changements (comme indiqué par @ hu-qiang).J'espère que cela pourra aider.
la source
Voici une autre approche, en utilisant uniquement les connaissances acquises de la visite jusqu'à ce point *
Si vous voulez
adjust()
agir comme une bascule (bien que rien ne suggère que ce soit le cas), utilisez:* (Bien qu'il ne mentionne pas explicitement comment spécifier un type de retour et un protocole)
la source
Voici une solution qui ne change pas la valeur d'énumération actuelle, mais leurs valeurs d'instance à la place (juste au cas où cela serait utile à quiconque).
la source
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 il est donc impossible d'avoir une variable que vous pouvez modifier.
Vous pouvez vous conformer au protocole mais vous ne pouvez pas avoir le même comportement avec la mutation que dans les classes.
la source
C'est un lien sur enum en swift.
Les structures et les énumérations sont des types valeur. Par défaut, les propriétés d'un type valeur ne peuvent pas être modifiées à partir de ses méthodes d'instance. lien
Ensuite, vous devez utiliser la fonction de mutation.
la source
Une autre option consiste à ajuster () pour basculer entre les cas comme suit:
la source
Voici en s'appuyant sur la réponse de Jack:
la source
Je suis venu avec ça
la source
voici mon code
la source
Ma première contribution ici:
Merci pour les autres!
la source
Cette expérience m'a également déconcerté, en raison des exemples précédents de SimpleClass et SimpleStructure montrant la propriété simpleDescription modifiée en interne, ce qui m'a fait penser que je devais faire la même chose. Après avoir examiné les autres réponses publiées ici et lu la documentation officielle d'Apple Swift 2.1, j'ai trouvé ceci:
Notez également que dans les exemples donnés par Apple pour SimpleClass et SimpleStructure avant cette expérience, la description simple est perdue en interne - vous ne pouvez pas récupérer la valeur d'origine (à moins bien sûr que vous ne la sauvegardiez en dehors de la classe / structure); c'est ce qui m'a incité à créer une méthode restore () pour l'exemple SimpleEnum, qui vous permet de basculer entre les valeurs. J'espère que cela est utile à quelqu'un!
la source
Je pensais que le but est simplement de conserver l'état et d'utiliser une description pour rendre l'état actuel plus facile à lire:
la source
Autre variante: utilisation des valeurs associées pour maintenir et afficher l'option précédente (de la forme "Sélectionné 1, ajusté de 2, ajusté de 1, ajusté de 2, ajusté de 1")
la source
que dis-tu de ça
la source