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