2016-04-11 41 views
2

使用swift後,它破壞了我對靜態變量和常量的看法。Swift:爲什麼非靜態方法不能調用靜態變量和常量(static let)而沒有dynamicType?

爲什麼swift不允許我們在其他方法中調用靜態變量和常量?

例如:

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

食人魔先生告訴我使用dynamicType

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

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

它的工作原理!那麼爲什麼我應該使用dynamicType來調用靜態變量?

最後的答案是:

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!!! 

它與其他語言真的不一樣。

+1

use self.dynamictype.name – ogres

+0

你說得對。你能告訴我爲什麼它和其他語言有很大不同嗎? – AarioAi

+0

你可以同時擁有一個實例屬性和一個類型(class/static)屬性。 –

回答

3

即使您在此類型中編寫代碼,也必須使用它們的類型來解決靜態變量。請參閱The Swift Programming Language (Swift 2.2) - Properties(在「查詢和設置類型屬性」中):

類型屬性用點語法進行查詢和設置,就像實例屬性一樣。但是,類型屬性被查詢並設置在類型上,而不是該類型的實例。

在你的代碼中,只需寫Aa.name而不是name,你就會好起來的。

相關問題