Die schnelle Dokumentation besagt, dass Klassen , Strukturen und Aufzählungen alle Protokollen entsprechen können, und ich kann zu einem Punkt gelangen, an dem sie alle übereinstimmen. Aber ich kann die Aufzählung nicht dazu bringen , sich ganz wie die Klassen- und Strukturbeispiele zu verhalten :
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
Ich habe nicht herausgefunden, wie ich das simpleDescription
durch einen Anruf ändern kann adjust()
. Mein Beispiel wird das natürlich nicht tun, weil der Getter einen fest codierten Wert hat, aber wie kann ich einen Wert für die festlegen, simpleDescription
während er noch dem entspricht ExampleProtocol
?
swift
enums
swift-protocols
Adrian Harris Crowne
quelle
quelle
adjust
FunktionVoid
in der zurückgegeben wirdExampleProtocol
, ist es dasselbe wie nur mitmutating func adjust()
. Wenn Sieadjust
einen Rückgabetyp haben möchten , können Sie das Protokoll ändern in: gist.github.com/anjerodesu/e1bf640576a3b6fa415fcase .Base:
Hier ist meine Einstellung dazu.
Da dies ein
enum
und kein istclass
, müssen Sie anders denken (TM) : Es ist Ihre Beschreibung, die sich ändern muss, wenn sich der "Zustand" Ihrerenum
Änderungen ändert (wie von @ hu-qiang hervorgehoben).Hoffentlich hilft das.
quelle
Hier ist ein anderer Ansatz, bei dem nur das Wissen verwendet wird, das bis zu diesem Zeitpunkt aus der Tour gewonnen wurde *
Wenn Sie
adjust()
als Umschalter fungieren möchten (obwohl nichts darauf hindeutet, dass dies der Fall ist), verwenden Sie:* (Obwohl nicht ausdrücklich erwähnt wird, wie ein Rückgabetyp und ein Protokoll angegeben werden)
quelle
Hier ist eine Lösung, die nicht den aktuellen Aufzählungswert ändert, sondern deren Instanzwerte (nur für den Fall, dass dies für irgendjemanden nützlich ist).
quelle
self = copy(self, self.desc + ", asdfasdf")
Es ist nicht möglich, Variablen ohne Getter und Setter in Enums zu definieren, und daher ist es unmöglich, eine Variable zu haben, die Sie ändern können.
Sie können sich an das Protokoll anpassen, aber Sie können sich beim Mutieren nicht wie in Klassen verhalten.
quelle
Es ist ein Link über Enum in Swift.
Strukturen und Aufzählungen sind Werttypen. Standardmäßig können die Eigenschaften eines Wertetyps nicht innerhalb seiner Instanzmethoden geändert werden. Verknüpfung
Dann müssen Sie die Mutationsfunktion verwenden.
quelle
Eine weitere Option ist, dass adjust () wie folgt zwischen den Fällen wechselt:
quelle
Hier baut auf Jacks Antwort auf:
quelle
Ich habe mir das ausgedacht
quelle
Hier ist mein Code
quelle
Mein erster Beitrag hier:
Danke für andere!
quelle
Dieses Experiment hat mich auch umgehauen, da die vorherigen SimpleClass- und SimpleStructure-Beispiele zeigten, dass die Eigenschaft simpleDescription intern geändert wurde, was mich zu der Annahme veranlasste, dass ich dasselbe tun musste. Nachdem ich mir die anderen hier veröffentlichten Antworten angesehen und die offizielle Dokumentation zu Apple Swift 2.1 gelesen hatte, kam ich zu folgendem Ergebnis:
Beachten Sie auch, dass in den Beispielen von Apple für SimpleClass und SimpleStructure vor diesem Experiment die einfache Beschreibung intern verloren geht - Sie können den ursprünglichen Wert nicht zurückerhalten (es sei denn, Sie speichern ihn natürlich außerhalb der Klasse / Struktur). Aus diesem Grund habe ich eine restore () -Methode für das SimpleEnum-Beispiel erstellt, mit der Sie zwischen den Werten hin und her wechseln können. Hoffe das ist nützlich für jemanden!
quelle
Ich dachte, dass das Ziel einfach darin besteht, den Status beizubehalten und eine Beschreibung zu verwenden, um den aktuellen Status leichter lesbar zu machen:
quelle
Eine weitere Variante: Verwenden der zugehörigen Werte zum Halten und Anzeigen der vorherigen Option (in der Form "Ausgewählte 1, angepasst von 2, angepasst von 1, angepasst von 2, angepasst von 1")
quelle
Wie wäre es damit
quelle