[英]Are lazy vars in Swift computed more than once?
Swift中的惰性變量是否多次計算? 我的印象是,他們取代了:
if (instanceVariable) {
return instanceVariable;
}
// set up variable that has not been initialized
來自Objective-C的范例(延遲實例化)。
那是他們的工作嗎? 基本上只在應用程序第一次要求變量時調用一次,然后才返回計算的結果?
還是像普通的計算屬性那樣每次都調用它?
我問的原因是因為我基本上希望在Swift中獲得一個可訪問其他實例變量的計算屬性。 假設我有一個名為“ fullName”的變量,它只是連接firstName
和lastName
。 我將如何在Swift中做到這一點? 似乎惰性變量是唯一的方法,因為在普通的計算變量(非惰性)中,我無法訪問其他實例變量。
所以基本上:
Swift中的懶惰變量是否被多次調用? 如果是這樣,我如何創建一個可以訪問實例變量的計算變量? 如果不是,如果出於性能原因我只希望一次計算一個變量,該怎么做?
第一次使用lazy var
只會計算一次。 之后,它們就像一個普通變量。
這很容易在操場上測試:
class LazyExample {
var firstName = "John"
var lastName = "Smith"
lazy var lazyFullName : String = {
[unowned self] in
return "\(self.firstName) \(self.lastName)"
}()
}
let lazyInstance = LazyExample()
println(lazyInstance.lazyFullName)
// John Smith
lazyInstance.firstName = "Jane"
println(lazyInstance.lazyFullName)
// John Smith
lazyInstance.lazyFullName = "???"
println(lazyInstance.lazyFullName)
// ???
如果以后要重新計算,請使用計算屬性(如果有昂貴的話,請使用后備變量)-就像在Objective-C中一樣。
不,惰性屬性僅初始化一次。 如果設置新值或重置為nil(用於可選屬性),則不會再次調用惰性初始化程序 。
我認為您需要的是一個計算屬性-它沒有存儲屬性的支持,因此它不參與初始化,因此您可以引用其他實例屬性。
為什么說“普通計算變量(非延遲),我無法訪問其他實例變量”?
答案說一個惰性變量只能被計算一次,這是不正確的 。 從https://docs.swift.org/swift-book/LanguageGuide/Properties.html上的文檔中,說明了以下內容:
如果多個線程同時訪問了標記有lazy修飾符的屬性,並且該屬性尚未初始化,則不能保證該屬性僅被初始化一次。
另外,請觀看此演講: https : //developer.apple.com/videos/play/wwdc2016/720/ 。 在17:00左右出現以下屏幕:
該演講為您提供了有關多線程的更多見解,我建議您觀看!
所有其他答案都是正確的,我想補充一點, 蘋果警告過lazy
變量和並發性:
如果多個線程同時訪問了標記有lazy修飾符的屬性,並且該屬性尚未初始化,則不能保證該屬性僅被初始化一次。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.