2014-10-04 12 views
20

Ich weiß, diese Antwort ist bereits in einer anderen Form hier gepostet, aber ich würde gerne mehr über zwingende Instanzvariablen in swift verstehen.Swift Überschreibung Instanzvariablen

Lassen Sie uns sagen, ich habe diesen Code

class BaseView:UIView{ 
let someVariable:Int = 1 
// do some work with someVariable 
} 

class ExtendedView:BaseView{ 
let someVariable:Int = 2 
} 

Ok. Nach dem, was ich gelesen habe, benötigt die Konstante ein Vorrang-Präfix. Andere Antworten sagten, dass ich Setter und Getter erklären sollte? Warum? Ich interessiere mich wirklich nicht für diese zwei. Ich brauche nur den Wert ersetzt. Ich kann die init Überschreibung nicht wirklich verwenden, weil ich von UIView vererbe, und das könnte ziemlich gefährlich sein (denke ich).

Alle Vorschläge sind willkommen.

+0

wie geschrieben, die wie separate und nicht verwandte Klassenvariablen aussehen, nur mit dem gleichen Namen. –

Antwort

43

Wie Sie sagen, kann man nicht einfach eine Konstante in einer Unterklasse neu definieren (es ist eine Konstante, nachdem alle). Der Fehler, den Sie erhalten, lautet "Überschreiben mit einer gespeicherten Eigenschaft nicht möglich". Es scheint möglich zu sein, eine var zu überschreiben, aber wenn ich die let someVariable zu var someVariable ändere, bekomme ich "mehrdeutige Verwendung von 'someVariable'", wenn ich darauf in der Unterklasse zugreife (Notiz - dasselbe passiert, ob ich override verwende oder nicht) .

Die einfachste Lösung ist ein Getter zu verwenden. Das ist wirklich eine Funktion, so dass Sie glücklich sie außer Kraft setzen kann, wird die Trägergröße für Sie verwaltet werden, und wenn Sie nicht über einen Setter liefern ... es wird für jede Klasse konstant sein:

class BaseView: UIView { 
    var someVariable: Int { get { return 1 } } 
    // do some work with someVariable 
} 

class ExtendedView: BaseView { 
    override var someVariable: Int { get { return 2 } } 
} 

let a = BaseView() 
a.someVariable // 1 
let b = ExtendedView() 
b.someVariable // 2 

Wie Kommentator @ user3633673 weist darauf hin, wenn Sie nur einen Getter (und nicht einen Setter), können Sie die get fallen können, aber ich habe es in der Klarheit wegen des Prinzips. Hier ist das Gleiche ohne es ...

class BaseView: UIView { 
    var someVariable: Int { return 1 } 
    // do some work with someVariable 
} 

class ExtendedView: BaseView { 
    override var someVariable: Int { return 2 } 
} 

let a = BaseView() 
a.someVariable // 1 
let b = ExtendedView() 
b.someVariable // 2 
+8

Für einige Leser sollte beachtet werden, dass das "Get" in einfachen schreibgeschützten berechneten Eigenschaften nicht notwendig ist. 'var someVariable: Int {return 1}' ist eine Abkürzung für 'var someVariable: Int {get {return 1}}'. – user3633673

+0

Vielen Dank, sehr gut erklärt! –