2016-02-27 13 views
6

Ich habe die Swift-Dokumentation gelesen und hier gesucht, bin mir aber immer noch nicht sicher, wie eine Klassenhierarchie implementiert werden soll, in der jede Unterklasse einen benutzerdefinierten Wert für eine geerbte statische Eigenschaft festlegt; das heißt:Verwirrung in Bezug auf das Überschreiben von Klasseneigenschaften in Swift

  1. Basisklasse definiert eine statische Eigenschaft: alle Instanzen teilen den gleichen Wert.
  2. Unterklasse überschreibt die statische Eigenschaft: Alle Instanzen haben den gleichen Wert , der sich von dem der Basisklasse unterscheidet.

Kann die Eigenschaft gespeichert werden?

Wie sollte ich auf den Wert der Eigenschaft innerhalb einer Instanzmethode (unabhängig von der bestimmten Klasse) zugreifen und immer den richtigen Wert erhalten? Funktioniert der folgende Code?

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

Antwort

10

Sie sind so nah, dort zu sein, mit der Ausnahme, dass Sie eine static Eigenschaft in einer Unterklasse nicht überschreiben können - das ist, was es bedeutet, static zu sein. Sie müssten also eine class-Eigenschaft verwenden, und das bedeutet, dass es sich um eine berechnete Eigenschaft handeln muss - Swift enthält keine gespeicherten class-Eigenschaften.

So:

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

Und seien wir testen:

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

Dank. Wenn also die Klassenvariable ein großes Wörterbuch enthält, das aus einer Datei gelesen wird (die ich mir nicht jedes Mal berechnen lassen kann), muss ich eine separate private gespeicherte statische Variable für jede Unterklasse einrichten und dort mein Wörterbuch speichern , und geben Sie ihren Wert in der überschriebenen (berechneten) Klasse zurück, richtig? –

+0

@NicolasMiari Eine Möglichkeit zur Umgehung der _ "Klassenvariablen können keine gespeicherten Eigenschaften sein" _ Einschränkung besteht darin, jede Klasse in eine eigene Datei _ zu setzen (was Sie normalerweise tun) _ und dann einen gespeicherten Dateibereich zu erstellen- Eigenschaft var, um die Klasse compressed-property var wie folgt zurückzulehnen: 'file private static var _thingStorage: String'. Dann wird Ihre berechnete Eigenschaft in Ihrer Klasse zu "override class var thing: String {return _thingStorage}". –

Verwandte Themen