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

Dou*_*ith 26 lazy-initialization swift computed-properties

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

if (instanceVariable) {
    return instanceVariable;
}

// set up variable that has not been initialized
Run Code Online (Sandbox Code Playgroud)

来自Objective-C的范例(懒惰的实例化).

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

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

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

所以基本上:

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

Aar*_*ger 23

lazy vars仅在您第一次使用时计算一次.在那之后,它们就像一个正常的变量.

这很容易在操场上测试:

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)
// ???
Run Code Online (Sandbox Code Playgroud)

如果您想稍后重新计算它,请使用计算属性(带有支持变量,如果它很昂贵) - 就像您在Objective-C中所做的那样.


Ant*_*nio 6

不,懒惰属性只初始化一次.如果设置新值或重置为nil(对于可选属性),则不会再次调用惰性初始值设定项.

我认为你需要的是一个计算属性 - 它没有存储属性的支持,所以它不参与初始化,因此你可以引用其他实例属性.

为什么这么说"正常的计算变量(非惰性)我无法访问其他实例变量"?


Bal*_*cze 6

所有其他答案都是正确的,我想补充一点,Applelazy变量和并发发出警告:

如果标记有lazy修饰符的属性被多个线程同时访问并且该属性尚未初始化,则不能保证该属性只会被初始化一次。


J. *_*Doe 6

声称惰性变量只能计算一次的答案是不正确的从https://docs.swift.org/swift-book/LanguageGuide/Properties.html的文档中,说明了以下内容:

如果标记有lazy修饰符的属性被多个线程同时访问并且该属性尚未初始化,则不能保证该属性只会被初始化一次。

另外,请观看此演讲:https://developer.apple.com/videos/play/wwdc2016/720/。17:00左右,出现如下界面:

在此输入图像描述

该演讲让您对多线程有了更多的了解,我建议您观看!