2016-02-27 17 views
6

Przeczytałem dokumenty Swift i przeszukano tutaj, ale nadal nie jestem pewien, w jaki sposób zaimplementować hierarchię klas, gdzie każda podklasa ustawia wartość niestandardową dla odziedziczonej właściwości statycznej; to jest:Nieporozumienia dotyczące nadpisywania właściwości klas w Swift

  1. Klasa podstawowa definiuje właściwość statyczną: wszystkie wystąpienia mają tę samą wartość.
  2. Podklasa zastępuje właściwość statyczną: wszystkie wystąpienia mają tę samą wartość, , która różni się od klasy bazowej.

Czy nieruchomość może być przechowywana?

Ponadto, w jaki sposób uzyskać dostęp do wartości właściwości z metody instancji (niezależnie od konkretnej klasy) i uzyskać poprawną wartość za każdym razem? czy poniższy kod zadziała?

class BaseClass 
{ 
    // To be overridden by subclasses: 
    static var myStaticProperty = "Hello" 

    func useTheStaticProperty() 
    { 
     // Should yield the value of the overridden property 
     // when executed on instances of a subclass: 
     let propertyValue = self.dynamicType.myStaticProperty 

     // (do something with the value) 
    } 

Odpowiedz

10

Jesteś tak blisko bycia tam, oprócz tego, że nie można zastąpić właściwość static w podklasie - czyli co to znaczy być static. Tak więc musisz użyć właściwości class, co oznacza, że ​​będzie to właściwość obliczona - Swift nie ma przechowywanych właściwości class.

Więc:

class ClassA { 
    class var thing : String {return "A"} 
    func doYourThing() { 
     print(self.dynamicType.thing) 
    } 
} 
class ClassB : ClassA { 
    override class var thing : String {return "B"} 
} 

I niech go przetestować:

ClassA().doYourThing() // A 
ClassB().doYourThing() // B 
+0

Dzięki. Jeśli więc zmienna klasy zawiera duży słownik odczytany z pliku (którego nie mogę obliczyć za każdym razem), będę musiał ustawić oddzielną, przechowywaną statyczną zmienną dla każdej podklasy, przechowywać tam mój słownik i zwraca jego wartość w przesłoniętej (obliczonej) klasie porperty, prawda? –

+0

@NicolasMiari Jednym ze sposobów obejścia "klasy vars nie mogą być przechowywane właściwości" _ ograniczenie polega na umieszczeniu każdej klasy we własnym pliku _ (co zwykle robisz) _, a następnie utworzeniu przechowywanego zakresu plików- Właściwość var ​​odwzorowuje klasę computed-property var, podobnie jak to: 'fileprivate static var _thingStorage: String'. Następnie w twojej klasie twoja własność obliczeniowa staje się 'override class var rzecz: String {return _thingStorage}'. –

Powiązane problemy