2014-10-04 12 views
20

Wiem, że ta odpowiedź została już opublikowana w innej formie tutaj, ale chciałbym dowiedzieć się więcej o nadpisywaniu zmiennych instancji w szybkim tempie.Swift zastępuje zmienne instancji

Powiedzmy mam ten kod

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

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

OK. Z tego, co przeczytałem, stała wymaga prefiksu przesłaniania. Inne odpowiedzi mówiły, że powinienem ogłosić setera i zdobywcę? Czemu? Naprawdę nie dbam o tych dwóch. Potrzebuję tylko zastąpionej wartości. Nie mogę naprawdę użyć override init ponieważ dziedziczę z UIView i może to być dość niebezpieczne (myślę).

Wszelkie sugestie są mile widziane.

+0

jak napisano te wyglądają jak oddzielne i niepowiązane zmienne klasy, tylko o tej samej nazwie. –

Odpowiedz

43

Tak jak mówisz, nie można po prostu przedefiniować stała w podklasie (jest to stała, mimo wszystko). Otrzymany błąd to "Nie można przesłonić przechowywanej właściwości". Wygląda na to, że możliwe jest zastąpienie var, jednak gdy zmienię let someVariable na var someVariable, uzyskuję "niejednoznaczne użycie" niektórych zmiennych ", gdy uzyskuję do niego dostęp w podklasie (uwaga - to samo dzieje się, czy używam override czy nie) .

Najprostszym rozwiązaniem jest użycie gettera. Tak naprawdę jest to funkcja, dzięki czemu można go zastąpić szczęśliwie, zmienna podkład będzie zarządzany dla Ciebie, a jeśli nie dostarczy setter ... to będzie stała dla każdej klasy:

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 

As commentator @ user3633673 zwraca uwagę, że jeśli masz tylko masz gettera (a nie settera), możesz upuścić get, ale zostawiłem to dla jasności zasady. Tutaj jest to bez niego ...

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

W przypadku niektórych czytników należy zauważyć, że "get" nie jest konieczny w prostych właściwościach tylko do odczytu. 'var someVariable: Int {return 1}' jest skrótem dla 'var someVariable: Int {get {return 1}}'. – user3633673

+0

Dziękuję bardzo dobrze wyjaśnione! –