2016-02-27 14 views
6

Ho letto i documenti Swift e cercato qui, ma non sono ancora sicuro su come implementare una gerarchia di classi in cui ogni sottoclasse imposta il valore personalizzato per una proprietà statica ereditata; ovvero:Confusione relativa alla sovrascrittura delle proprietà della classe in Swift

  1. La classe base definisce una proprietà statica: tutte le istanze condividono lo stesso valore.
  2. Sottoclasse sovrascrive la proprietà statica: tutte le istanze condividono lo stesso valore, che è diverso da quello della classe base.

La proprietà può essere memorizzata?

Inoltre, come devo accedere al valore della proprietà da un metodo di istanza (indipendentemente dalla classe particolare) e ottenere il valore corretto ogni volta? funzionerà il seguente codice?

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) 
    } 

risposta

10

Tu sei così vicino ad essere lì, tranne che non si può ignorare una proprietà static in una sottoclasse - questo è ciò che significa essere static. Quindi dovresti usare una proprietà class e questo significa che dovrà essere una proprietà calcolata - Swift non ha le proprietà memorizzate class.

Quindi:

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

E Testiamola:

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

Grazie. Quindi, se la variabile di classe contiene qualche grande dizionario letto dal file (che non posso permettermi di calcolare ogni volta), dovrò impostare una variabile statica separata, privata memorizzata per ogni sottoclasse, memorizzare il mio dizionario lì e restituire il suo valore nella sovrascrittura (calcolata) della classe, giusto? –

+0

@NicolasMiari Un modo per aggirare il _ "class vars non può essere memorizzato proprietà" _ restriction consiste nel mettere ogni classe nel proprio file _ (cosa che generalmente si fa comunque) _ e quindi creare un file-scope memorizzato- property var per eseguire il backup della classe computed-property var, come questa: 'fileprivate static var _thingStorage: String'. Quindi, nella tua classe, la tua proprietà calcolata diventa 'var override class thing: String {return_thingStorage}'. –

Problemi correlati