Swift中的懒惰变量是不是一次计算过的?

时间:2014-10-19 20:02:00

标签: swift lazy-initialization computed-properties

Swift中的懒惰变量是否计算过多次?我的印象是他们取代了:

if (instanceVariable) {
    return instanceVariable;
}

// set up variable that has not been initialized

Objective-C的范式(懒惰的实例化)。

他们这样做了吗?基本上只在第一次应用程序要求变量时调用,然后才返回计算的内容?

或者它每次都像普通计算属性一样被调用?

我问的原因是因为我基本上想要一个可以访问其他实例变量的Swift中的计算属性。假设我有一个名为" fullName"的变量。它只是连接firstNamelastName。我怎么会在Swift中这样做?似乎懒惰的变量是唯一的方法,就像在普通的计算变量(非惰性)中我无法访问其他实例变量。

基本上是这样的:

Swift中的懒惰变量不止一次被调用吗?如果是这样,我如何创建一个可以访问实例变量的计算变量?如果没有,如果出于性能原因我只想要计算一次变量,我该怎么做?

4 个答案:

答案 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左右,出现以下屏幕:

enter image description here

该演讲为您提供了有关多线程的更多见解,我建议您观看!