2016-01-07 56 views
24

我剛剛注意到Swift structsstatic成員隱含爲lazySwift隱式惰性靜態成員

舉例來說,這樣只會調用init一次:

class Baz { 
    init(){ 
     print("initializing a Baz") 
    } 
} 
struct Foo { 
    static let bar = Baz() 
} 

var z = Foo.bar 
z = Foo.bar 

什麼是這背後的原理是什麼?

如果我想要相反的行爲呢?

+5

對於全局變量在這裏是懶惰的選擇有一些理由:https://developer.apple.com/swift/blog/?id = 7。靜態成員可能會有類似的基本原理,除了更少的啓動初始化的原因(我的意思是,如果你甚至從來沒有使用類型,它只是通過導入?如果所有靜態變量仍然被初始化而不管使用?) –

回答

39

static屬性定義了一個「type屬性」,一個實例化一次且只有一次。正如你注意到的,這發生在懶惰,因爲靜態行爲像全局一樣。並且如The Swift Programming Language: Properties所示:

全局常量和變量總是延遲計算,與Lazy Stored Properties類似。與惰性存儲屬性不同,全局常量和變量不需要使用lazy修飾符進行標記。

這隱含偷懶行爲是因爲,作爲Swift Blog: Files and Initialization說:

它允許自定義初始化,在迅捷啓動時間乾淨秤沒有全球初始化慢下來,和執行的順序是完全可預測。

他們有意識地設計了這種方式,以避免不必要地延遲應用程序的啓動。

如果您想在應用程序中的某個特定位置實例化static屬性(而不是將其推遲到第一次使用的位置),只需在該更早的點處引用此屬性並在此時初始化該對象。鑑於我們爲減少啓動應用程序的延遲而付出的努力,在應用程序的首次啓動期間,您通常不會希望這樣做,但您可以隨時隨地執行此操作。

+0

在「靜態釋放緩存= NSCache()」示例中,在啓動時初始化緩存,或者僅在「首次使用緩存」時進行緩存初始化......? – Fattie

+0

這很懶。我已經更新了我的答案以澄清這一點。 – Rob