Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift中的懒惰变量是否计算过多次?_Swift_Lazy Initialization_Computed Properties - Fatal编程技术网

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中

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”