[英]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.