Ich habe festgestellt, dass der Compiler nicht zulässt, dass ich eine gespeicherte Eigenschaft mit einem anderen gespeicherten Wert überschreibe (was seltsam erscheint):
class Jedi {
var lightSaberColor = "Blue"
}
class Sith: Jedi {
override var lightSaberColor = "Red" // Cannot override with a stored property lightSaberColor
}
Ich darf dies jedoch mit einer berechneten Eigenschaft tun:
class Jedi {
let lightSaberColor = "Blue"
}
class Sith: Jedi {
override var lightSaberColor : String{return "Red"}
}
Warum darf ich ihm keinen anderen Wert geben?
Warum ist das Überschreiben mit einer gespeicherten Eigenschaft ein Greuel und das mit einem berechneten koscheren Objekt? Was denken sie?
inheritance
swift
properties
overriding
cfischer
quelle
quelle
Antworten:
Sie dürfen einer geerbten Eigenschaft definitiv einen anderen Wert geben. Sie können dies tun, wenn Sie die Eigenschaft in einem Konstruktor initialisieren, der diesen Anfangswert annimmt, und einen anderen Wert als die abgeleitete Klasse übergeben:
Das Überschreiben einer Eigenschaft ist nicht dasselbe wie das Geben eines neuen Werts - es ist eher so, als würde man einer Klasse eine andere Eigenschaft geben. Genau das passiert, wenn Sie eine berechnete Eigenschaft überschreiben: Der Code, der die Eigenschaft in der Basisklasse berechnet, wird durch Code ersetzt, der die Überschreibung für diese Eigenschaft in der abgeleiteten Klasse berechnet.
Abgesehen von Beobachtern haben gespeicherte Eigenschaften kein Verhalten, sodass wirklich nichts zu überschreiben ist. Durch den oben beschriebenen Mechanismus ist es möglich, der Eigenschaft einen anderen Wert zu geben. Dies macht genau das, was das Beispiel in der Frage mit einer anderen Syntax erreichen will.
quelle
Für mich funktioniert Ihr Beispiel in Swift 3.0.1 nicht.
Ich habe auf dem Spielplatz diesen Code eingegeben:
Wirft beim Kompilieren einen Fehler in Xcode:
Nein, Sie können den Typ der gespeicherten Eigenschaft nicht ändern. Das Liskov-Substitutionsprinzip zwingt Sie dazu, zuzulassen, dass eine Unterklasse an einem Ort verwendet wird, an dem die Oberklasse gewünscht wird.
Wenn Sie es jedoch in die berechnete Eigenschaft ändern
var
und daher hinzufügenset
, können Sie die gespeicherte Eigenschaft mit einer berechneten Eigenschaft desselben Typs überschreiben.Dies ist möglich, weil es sinnvoll sein kann, von einer gespeicherten Eigenschaft zu einer berechneten Eigenschaft zu wechseln.
Das Überschreiben einer gespeicherten
var
Eigenschaft mit einer gespeichertenvar
Eigenschaft ist jedoch nicht sinnvoll, da Sie nur den Wert der Eigenschaft ändern können.Sie können eine gespeicherte Eigenschaft jedoch überhaupt nicht mit einer gespeicherten Eigenschaft überschreiben.
Ich würde nicht sagen, dass Sith Jedi sind :-P. Daher ist es klar, dass dies nicht funktionieren kann.
quelle
quelle
Sie möchten der Eigenschaft wahrscheinlich einen anderen Wert zuweisen:
quelle
Für Swift 4 aus Apples Dokumentation :
quelle
In Swift ist dies leider nicht möglich. Die beste Alternative ist die folgende:
quelle
Ich hatte das gleiche Problem, eine Konstante für einen View Controller festzulegen.
Da ich zum Verwalten der Ansicht den Interface Builder verwende, kann ich ihn nicht verwenden
init()
. Daher war meine Problemumgehung ähnlich wie bei anderen Antworten, außer dass ich eine schreibgeschützte berechnete Variable sowohl für Basisklassen als auch für geerbte Klassen verwendet habe.quelle
Wenn Sie dies in Swift 5 versuchen, werden Sie von a begrüßt
Am besten deklarieren Sie es als berechnete Eigenschaft.
Dies funktioniert, da wir nur die
get {}
Funktion überschreibenquelle
Mit Swift können Sie eine Variable nicht überschreiben.
stored property
Stattdessen können Sie sie verwendencomputed property
Im Vergleich zu Java ist es klarer, wenn ein Klassenfeld nicht überschrieben werden kann und keinen Polymorphismus unterstützt, da es in der Kompilierungszeit definiert ist (effizient ausgeführt wird). Es wird eine Variable genannt, die [About] versteckt. Es wird nicht empfohlen, diese Technik zu verwenden, da sie schwer zu lesen / zu unterstützen ist
[Schnelle Eigenschaft]
quelle
Sie können auch eine Funktion zum Überschreiben verwenden. Es ist keine direkte Antwort, kann aber dieses Thema bereichern.
Klasse a
Klasse B: A.
quelle