2016-04-11 15 views
2

Es hat meine Sicht auf statische Variablen und Konstante nach der Verwendung von Swift zerstört.Swift: Warum können die nicht statischen Methoden statische Variablen und Konstanten (statische Let) ohne dynamicType nicht aufrufen?

Warum schnell erlaubt uns nicht, statische Variablen und konstant in anderen Methoden zu nennen?

zum Beispiel:

class Aa { 
    static let name = "Aario" 
    func echo() { 
     print(name)  // Error! 
    } 
} 

Herr Oger hat mir gesagt, dynamicType zu verwenden.

class Aa { 
    static var name = "Aario" 
    func echo() { 
     print(self.dynamicType.name) 
    } 
} 

let a = Aa() 
a.dynamicType.name = "Aario Ai" 
a.echo()       // it works!!! 

Es funktioniert! Warum sollte ich dynamicType verwenden, um statische Variablen aufzurufen?

Schließlich lautet die Antwort:

class Aa { 
    static var name = "Static Variable" 
    var name = "Member Variable" 
    func echo() { 
     print(self.dynamicType.name) // Static Variable 
     print(Aa.name)     // Static Variable 
     print(name)      // Member Variable 
    } 
} 

let a = Aa() 
a.dynamicType.name = "Aario Ai" 
Aa.name = "Static: Aario" 
a.name = "Member: Aario" 
a.echo()       // it works!!! 

Es ist wirklich anders mit anderen Sprachen.

+1

Verwenden Sie self.dynamictype.name – ogres

+0

Sie haben Recht. Kannst du mir sagen, warum es bei anderen Sprachen anders ist? – AarioAi

+0

Sie können sowohl eine Instanzeigenschaft als auch eine type (class/static) -Eigenschaft mit demselben Namen haben. –

Antwort

3

Statische Variablen müssen mit ihrem Typ adressiert werden, auch wenn Sie Code innerhalb dieses Typs schreiben. Siehe The Swift Programming Language (Swift 2.2) - Properties (in „Abfragen und Einstellen Typ-Eigenschaften“):

Typ Eigenschaften abgefragt und eingestellt mit Punktsyntax, wie zB Eigenschaften. Typeigenschaften werden jedoch abgefragt und auf den Typ festgelegt, nicht auf eine Instanz dieses Typs.

in Ihrem Code schreiben einfach Aa.name statt name und Sie werden in Ordnung sein.