繁体   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