帶閉包的懶惰變量
回答
你引用的教程代碼是這樣的:
private lazy var variable:SomeClass = {
let fVariable = SomeClass()
fVariable.value = 10
return fVariable
}()
與此對比吧:
private var variable:SomeClass {
let fVariable = SomeClass()
fVariable.value = 10
return fVariable
}
第一個初始化variable
到新創建的SomeClass的實例,一次最多(和甚至可能沒有那麼多次)。第二個是隻讀計算變量,並在每次讀取其值時創建一個新的SomeClass實例。
你的直覺是對的,那篇文章是不正確的。我猜測作者正在將計算出的屬性語法與立即執行的關閉技巧混爲一談。 lazy
關鍵字與關閉執行多少次無關。 lazy
只是簡單地導致該屬性保持未初始化,直到第一次訪問,此時評估等號右側的表達式。
爲了簡化,此:
var myVar: MyType {
return MyType()
}
比這非常不同:
var myVar: MyType = MyType()
這是在存儲類似,但具有不同的初始化語義比這:
lazy var myVar: MyType = MyType()
在第一個例子,myVar
是一個計算屬性和cu中的代碼每次訪問myVar
時都會執行大括號。換句話說,每次訪問myVar
時,都會得到一個新創建的對象。
在第二個示例中,myVar
是存儲的屬性,等號後面的表達式在包含該屬性的類或結構的初始化過程中計算一次。
在第三個示例中,myVar
仍然是一個存儲屬性,但在等號(不論是初始值設定表達式,函數調用還是閉包調用)之後,對錶達式的求值將被延遲,直到它被訪問。
作爲一個側面說明,這行代碼:
lazy var myVar: MyType = { ... }()
等同於:
func doStuffAndReturnMyType() { ... }
lazy var myVar: MyType = doStuffAndReturnMyType()
在第一個例子中的簡寫不是專門設計的,它只是工作,因爲斯威夫特類型系統(非常棒),並將閉包視爲未命名(匿名)函數。
很清楚,謝謝。 – Boon
我是否在這行中不需要拖尾括號'func doStuffAndReturnMyType(){...}()'? –
@ShadowOf好,我的錯。我編輯了這篇文章來解決它。 –
- 1. Swift弱懶惰變量不會編譯
- 2. 使全局變量不懶惰
- 3. 懶惰類包括PHP
- 4. 關閉django中的懶惰評價
- 5. F#關閉中的懶惰評估
- 6. 是什麼讓一個符號變成懶惰或非懶惰?
- 7. 張量流動懶惰?
- 8. 帶謂詞的懶惰評估
- 9. 帶懶惰集合的Hibernate LazyInitializationException
- 10. 帶有懶惰XML解析的UITableViewCell
- 11. F#懶惰評估與非懶惰
- 12. 懶惰評價不那麼懶惰?
- 13. 懶惰加載的R包的更新
- 14. 懶惰選擇
- 15. hGetContents太懶惰
- 16. preg_match懶惰?
- 17. 關於懶惰
- 18. 懶惰評價
- 19. 是getLine懶惰?
- 20. 懶惰SlidingDrawer
- 21. Swift中的懶惰
- 22. Hadoop的懶惰distributedcache
- 23. 懶惰的評價
- 24. 懶惰的評價
- 25. 使Rails中的TimeWithZone對象變懶惰
- 26. Scala的本地懶惰變量是如何實現的?
- 27. Haskell:原子IO包裝/懶惰?
- 28. python懶惰變量?或者延遲昂貴的計算
- 29. 使用懶惰變量時的編譯錯誤
- 30. 對Pebble/Freemarker變量/插值的懶惰評估
我的書中的解釋更好:http://www.apeth.com/swiftBook/ch03。html#_lazy_initialization – matt
謝謝 - 書的解釋非常好。 – Boon