Swift中的懒惰变量是否计算过多次?
Swift中的懒惰变量是否计算过多次?我的印象是,他们取代了:Swift中的懒惰变量是否计算过多次?,swift,lazy-initialization,computed-properties,Swift,Lazy Initialization,Computed Properties,Swift中的懒惰变量是否计算过多次?我的印象是,他们取代了: if (instanceVariable) { return instanceVariable; } // set up variable that has not been initialized 来自Objective-C(惰性实例化)的范例 他们就是这么做的吗?基本上,在应用程序第一次请求变量时只调用一次,然后只返回计算出的值 或者它每次都像普通的计算属性一样被调用 我问这个问题的原因是因为我基本上希望Swift中
if (instanceVariable) {
return instanceVariable;
}
// set up variable that has not been initialized
来自Objective-C(惰性实例化)的范例
他们就是这么做的吗?基本上,在应用程序第一次请求变量时只调用一次,然后只返回计算出的值
或者它每次都像普通的计算属性一样被调用
我问这个问题的原因是因为我基本上希望Swift中有一个可以访问其他实例变量的计算属性。假设我有一个名为“fullName”的变量,它只是连接firstName
和lastName
。在斯威夫特我该怎么做?看起来懒惰变量是唯一的选择,因为在普通的计算变量(非懒惰变量)中,我无法访问其他实例变量
所以基本上:
斯威夫特的懒惰士兵会被多次呼叫吗?如果是这样,我如何创建一个可以访问实例变量的计算变量?如果不是,如果出于性能原因,我只希望一个变量计算一次,我该怎么做?否,惰性属性只初始化一次。如果设置新值或重置为nil(对于可选属性),则不会再次调用惰性初始值设定项 我认为您需要的是一个计算属性—它不受存储属性的支持,因此它不涉及初始化,因此您可以引用其他实例属性
为什么说“普通计算变量(非惰性)我不能访问其他实例变量”不,惰性属性只初始化一次。如果设置新值或重置为nil(对于可选属性),则不会再次调用惰性初始值设定项 我认为您需要的是一个计算属性—它不受存储属性的支持,因此它不涉及初始化,因此您可以引用其他实例属性
为什么说“普通计算变量(非惰性)我不能访问其他实例变量”
惰性变量在您第一次使用它们时只计算一次。之后,它们就像一个正态变量
这很容易在操场上测试:
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)
// ???
如果以后要重新计算,请使用computed属性(如果代价高昂,请使用支持变量)——就像在Objective-C中所做的那样。惰性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)
// ???
如果以后要重新计算,请使用computed属性(如果代价高昂,请使用支持变量)-就像您在Objective-C中所做的那样。所有其他答案都是正确的,我只想补充一点,Apple警告有关惰性
变量和并发性:
如果多个用户访问标记有惰性修饰符的属性
同时执行线程,并且属性尚未初始化,
无法保证该属性只初始化一次
所有其他答案都是正确的,我只想补充一点,Apple对lazy
变量和并发性发出警告:
如果多个用户访问标记有惰性修饰符的属性
同时执行线程,并且属性尚未初始化,
无法保证该属性只初始化一次
说明惰性var只能计算一次的答案是不正确的。根据位于的文件,说明如下:
如果多个用户访问标记有惰性修饰符的属性
同时执行线程,并且属性尚未初始化,
无法保证该属性只初始化一次
另外,请看以下对话:。17:00左右,出现以下屏幕:
这篇演讲让您对多线程有了更多的了解,我建议您观看 指出惰性var只能计算一次的回答是不正确的。根据位于的文件,说明如下:
如果多个用户访问标记有惰性修饰符的属性
同时执行线程,并且属性尚未初始化,
无法保证该属性只初始化一次
另外,请看以下对话:。17:00左右,出现以下屏幕:
这篇演讲让您对多线程有了更多的了解,我建议您观看 一,。什么意思是计算属性没有存储属性的支持?全名不是由firstName、lastName支持吗?2.除了lazy被初始化一次之外,这两者之间的主要区别是:对于lazy,如果您设置lazyFullName,那么您只需设置它……但是对于computedLazyFullName,如果您设置它,那么您需要一些机制来正确更新存储的firstName、lastName属性?1。什么意思是计算属性没有存储属性的支持?全名不是由firstName、lastName支持吗?2.除了lazy被初始化一次之外,这两者之间的主要区别是:对于lazy,如果您设置lazyFullName,那么您只需设置它……但是对于computedLazyFullName,如果您设置它,那么您需要一些机制来正确更新存储的firstName、lastName属性?代码没有问题。。。但这有潜在的误导性,即如果在访问lazyFullName
之前将firstName
更改为“Jane”,那么它将打印“Jane Smith”,而您的代码没有问题。。。但这可能会产生误导,即如果您在访问lazyFullName
之前将firstName
更改为“Jane”,那么它将打印“Jane Smith”