Wie überschreibe ich den Setter des gespeicherten Eigentums in Swift?
In Obj-C kann ich den Setter überschreiben, aber Swift scheint nicht glücklich darüber zu sein, dass Getter / Setter für gespeicherte Objekte verwendet werden.
Angenommen, ich habe eine Card
Klasse mit einer Eigenschaft namens rank
. Ich möchte nicht, dass der Client ihm einen ungültigen Wert gibt, daher kann ich in Ziel-C überschreiben, setRank
damit er eine zusätzliche Prüfung durchführt. Aber willSet
in Swift scheint es nicht zu helfen, weil newValue
es konstant ist und es keinen Sinn macht, es zuzuweisen, rank
da der Setter in einer Schleife aufgerufen wird.
Antworten:
OK. Lesen durch Apples Dokumentation auf Swift fand ich diese :
Alles was Sie tun müssen ist Folgendes:
quelle
var rankTimesTwo: Int { get { return rank * 2 } }
Sie können
get
/set
für eine gespeicherte Eigenschaft nicht überschreiben, aber Sie können EigenschaftsbeobachterwillSet
/ verwendendidSet
.Die Standardparameternamen sind
newValue
fürwillSet
undoldValue
fürdidSet
, oder Sie können sie selbst wie in benennenwillSet(newTotalSteps)
.quelle
Card
Klasse mit einer Eigenschaft namensrank
. Ich möchte nicht, dass der Client ihm einen Wert gibt, daher kann ich in Ziel-C überschreiben,setRank
damit er eine zusätzliche Prüfung durchführt. AberwillSet
in Swift scheint es nicht zu helfen, weilnewValue
es konstant ist und es keinen Sinn macht, es zuzuweisen,rank
da der Setter in einer Schleife aufgerufen wird.didSet
überprüfen,rank
nachdem es eingestellt wurde, und wenn es die Validierung nicht besteht, setzen Sie es auf etwas anderes zurück, zoldValue
.get und set sind für berechnete Eigenschaften (sie haben keinen Hintergrundspeicher). (Meiner Meinung nach ist das Schlüsselwort 'var' hier verwirrend)
quelle
Wenn Sie didSet nicht verwenden möchten, da das Problem besteht, dass der Wert der Eigenschaft vorübergehend falsch ist, sollten Sie eine berechnete Eigenschaft darum wickeln.
Oder:
quelle
foo
ist nur ein berechneter Ausdruck von_foo
. Lassen Sie sich nicht vom Schlüsselwort "var" täuschen! Dies bedeutet, dass zwei Einträge über den privaten Namespace zugänglich sind. Dies hat jedoch keinen Einfluss auf protected / public und behält den Wert vonfoo
jederzeit bei. Dies ist im Wesentlichen das "Ansicht" -Muster. Das Problem beim Umschreiben überdidSet
, zusätzlich zu einer ungültigen Zeitspanne, besteht darin, dass ein erhebliches Potenzial für eine Endlosschleife besteht, da Sie dendidSet
Handler von innen erneut eingebendidSet
.Vereinfachtes Beispiel:
Vollständiges Beispiel
Schauen Sie sich
perimeter
dieses Beispiel an.Auszug aus: Apple Inc. "Die schnelle Programmiersprache". iBooks. https://itun.es/us/jEUH0.l
quelle
perimeter
handelt es sich immer noch um eine berechnete Eigenschaft. Wie überschreibe ich sideLength, ohne eine berechnete Eigenschaft einzuführen?get
undset