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"的变量,它只是连接firstName和lastName.我怎么会在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中所做的那样.
不,懒惰属性只初始化一次.如果设置新值或重置为nil(对于可选属性),则不会再次调用惰性初始值设定项.
我认为你需要的是一个计算属性 - 它没有存储属性的支持,所以它不参与初始化,因此你可以引用其他实例属性.
为什么这么说"正常的计算变量(非惰性)我无法访问其他实例变量"?
所有其他答案都是正确的,我想补充一点,Apple对lazy变量和并发发出警告:
如果标记有lazy修饰符的属性被多个线程同时访问并且该属性尚未初始化,则不能保证该属性只会被初始化一次。
声称惰性变量只能计算一次的答案是不正确的。从https://docs.swift.org/swift-book/LanguageGuide/Properties.html的文档中,说明了以下内容:
如果标记有lazy修饰符的属性被多个线程同时访问并且该属性尚未初始化,则不能保证该属性只会被初始化一次。
另外,请观看此演讲:https://developer.apple.com/videos/play/wwdc2016/720/。17:00左右,出现如下界面:
该演讲让您对多线程有了更多的了解,我建议您观看!
| 归档时间: |
|
| 查看次数: |
6104 次 |
| 最近记录: |