簡體   English   中英

Swift中的惰性變量是否多次計算?

[英]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”的變量,它只是連接firstNamelastName 我將如何在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM