2016-08-02 63 views
2

swift中的靜態屬性被初始化爲懶惰。我想使用類的靜態屬性作爲依賴關係,我可以在進行單元測試時輕鬆替換它。該屬性的值立即被調用了閉包,但是我希望這個閉包永遠不會執行,如果我沒有閱讀它就更換該屬性。爲什麼在賦值時執行靜態屬性的閉包?

但是,通過設置靜態屬性,原始閉包得到執行。懶惰的實例屬性並非如此。這是爲什麼?

爲了說明這個問題,我提供了一個示例代碼。

這段代碼的輸出:

class Foo { 
    static var bar1: String = { 
     print("here we are") 
     return "This is static bar" 
    }() 

    lazy var bar2: String = { 
     print("here we are too") 
     return "This is instance bar" 
    }() 
} 

let foo = Foo() 
print("We have a Foo instance") 
Foo.bar1 = "Overwritten bar 1" 
print(Foo.bar1) 
foo.bar2 = "Overwritten bar 2" 
print(foo.bar2) 

是:

We have a Foo instance 
here we are 
Overwritten bar 1 
Overwritten bar 2 
+0

我更新了代碼,以說明它不會在實例初始化時發生。此外,可以通過在關閉中放置斷點並查看堆棧跟蹤來確認。 –

回答

1

但是在設置靜態屬性,原有的封閉被執行。懶惰的實例屬性並非如此。這是爲什麼?

什麼答案會滿足你?你是否要求某人閱讀蘋果的想法?您可以像其他人一樣閱讀Swift源代碼,所以請閱讀它並查看它的功能。就我個人而言,我同意你的期望。在我看來,這種行爲是一個錯誤,我已經向Apple提交了一個錯誤報告。如果你同意,也可以提交一份。但是,如果我是你,我不會期望有什麼變化。不管怎麼說,你的問題只能吸引意見,這不適合Stack Overflow。

如果你很好奇,我的錯誤報告編號爲19085421,和讀,一部分:

摘要:懶惰的VAR的初始化不應該在所有如果 進行評估的變量被寫入而不是先閱讀。但這是全球變種所做的。

重現步驟:運行隨附的項目。

預期結果:我正在爲任何人在 讀取其值之前分配給全局var。因此我預計它的初始化程序將會對永不 進行評估。

實際結果:及其初始化評價,如在 控制檯中的日誌證明。這在某種程度上會導致懶惰的目的。

+0

嘿,感謝您的錯誤報告信息!我不確定這是否是一個錯誤,我只是覺得我沒有得到某些東西,並且有一個很好的理由說明它發生的方式。 –

相關問題