Swift中的懒惰变量是否计算过多次?我的印象是他们取代了:
if (instanceVariable) {
return instanceVariable;
}
// set up variable that has not been initialized
Objective-C的范式(懒惰的实例化)。
他们这样做了吗?基本上只在第一次应用程序要求变量时调用,然后才返回计算的内容?
或者它每次都像普通计算属性一样被调用?
我问的原因是因为我基本上想要一个可以访问其他实例变量的Swift中的计算属性。假设我有一个名为" fullName"的变量。它只是连接firstName
和lastName
。我怎么会在Swift中这样做?似乎懒惰的变量是唯一的方法,就像在普通的计算变量(非惰性)中我无法访问其他实例变量。
基本上是这样的:
Swift中的懒惰变量不止一次被调用吗?如果是这样,我如何创建一个可以访问实例变量的计算变量?如果没有,如果出于性能原因我只想要计算一次变量,我该怎么做?
答案 0 :(得分:23)
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中所做的那样。
答案 1 :(得分:6)
不,懒惰属性只初始化一次。如果您设置了新值,或重置为nil(对于可选属性),则再次调用lazy 初始值设定项 。
我认为你需要的是一个计算属性 - 它没有存储属性的支持,所以它不参与初始化,因此你可以引用其他实例属性。
为什么你说"正常的计算变量(非懒惰)我无法访问其他实例变量"?
答案 2 :(得分:1)
所有其他答案都是正确的,我想补充一下, Apple 警告lazy
变量和并发:
如果标有lazy修饰符的属性被多个访问 同时执行线程,并且该属性尚未初始化, 无法保证该属性只能被初始化一次。
答案 3 :(得分:1)
回答说一个惰性变量只能计算一次,不正确。 https://docs.swift.org/swift-book/LanguageGuide/Properties.html的文档中指出以下内容:
如果标有lazy修饰符的属性被多个访问 同时执行线程,并且该属性尚未初始化, 无法保证该属性只能被初始化一次。
另外,请观看此演讲:https://developer.apple.com/videos/play/wwdc2016/720/。在17:00左右,出现以下屏幕:
该演讲为您提供了有关多线程的更多见解,我建议您观看!