檢查: Type Properties
注意
與存儲實例屬性,你必須給存儲 類型屬性的默認值。這是因爲類型本身沒有 初始值設定項,它可以在 初始化時間將值分配給存儲的類型屬性。
存儲類型屬性在其第一次訪問時被懶惰地初始化。 它們保證只初始化一次,即使同時通過多個線程訪問 ,並且它們不需要使用惰性修飾符標記爲 。
您必須始終將存儲類型屬性設置爲默認值。
您的代碼缺少默認值爲myString
,在這種情況下,斯威夫特給它一個默認nil
。
存儲類型屬性在其第一次訪問時被懶惰地初始化。
您可以測試和查看存儲類型的屬性是如何與一些像這樣的代碼initilized:
func ZeroGenerator() -> Int {
print(#function)
return 0
}
func ThreeGenerator() -> Int {
print(#function)
return 3
}
func NilGeneartor() -> String? {
print(#function)
return nil
}
struct Something {
static var myVariable = ZeroGenerator()
static let myConstant = ThreeGenerator()
static var myString: String? = NilGeneartor()
static func useStaticVar() {
print(#function)
myVariable = myConstant
myString = String(myVariable)
}
}
Something.useStaticVar()
輸出:
useStaticVar()
ZeroGenerator()
ThreeGenerator()
NilGeneartor()
編譯器可以使恆定的默認值一些優化,但語義上沒有區別。
什麼時候它是initalized?程序運行時? didFinishLaunchingWithOptions之前?在這之後? – Esqarrouth