当前位置: 首页 > 知识库问答 >
问题:

Swift中的lazy vars是否计算了多次?

燕烨
2023-03-14

Swift中的lazy vars是否计算了多次?我的印象是,他们取代了:

if (instanceVariable) {
    return instanceVariable;
}

// set up variable that has not been initialized

来自Objective-C的范式(惰性实例化)。

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

还是每次都像普通计算属性那样调用它?

我这样问的原因是因为我希望Swift中的一个计算属性能够访问其他实例变量。假设我有一个名为“fullName”的变量,它只是将< code>firstName和< code>lastName连接起来。我如何在Swift中做到这一点?似乎懒惰变量是唯一的出路,因为在普通的计算变量(非懒惰)中,我不能访问其他实例变量。

所以基本上:

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

共有3个答案

宇文和同
2023-03-14

指出惰性变量只能计算一次的答案是不正确的。根据https://docs . swift . org/swift-book/language guide/properties . html上的文档,陈述了以下内容:

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

另外,请收看本次谈话:https://developer.apple.com/videos/play/wwdc2016/720/. 17:00左右,出现以下画面:

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

狄楷
2023-03-14

不,惰性属性只初始化一次。如果你设置了一个新的值,或者重置为nil(对于可选属性),惰性初始化器就不会被再次调用

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

为什么你说“普通计算变量(非惰性)我不能访问其他实例变量”?

宇文良骏
2023-03-14

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)
// ???

如果您稍后想要重新计算它,请使用一个计算属性(如果代价很高,请使用后备变量)——就像您在Objective-C中所做的那样。

 类似资料:
  • 问题内容: 我正在尝试在客户端计算机上安装Java Windows应用程序。我想检查计算机上是否安装了必需的JRE。我想通过Java程序而不是通过cmd命令进行检查 问题答案: 如果您使用的是Windows或Linux操作系统,则在命令提示符/终端中输入 如果正确安装了Java,那么您将得到类似的内容 旁注: 在Windows操作系统上安装Java之后,将PATH变量更改为添加java.exe,因

  • 问题内容: 我最近了解到,“%”符号用于计算Python中整数的余数。但是我无法确定是否还有其他运算符或方法来计算Python中的百分比。 就像使用“ /”会给您商数一样,如果仅对整数之一使用浮点数,它实际上会像传统除法一样为您提供答案。那么有没有一种方法可以计算出百分比呢? 问题答案: 在Python中没有这样的运算符,但是自己实现是很简单的。在计算实践中,百分比几乎不像模数有用,所以我认为没有

  • 我知道Android支持NDK。我找不到一个以某种方式说明Android Things是否支持RenderScript Compute的引用。我的假设是否定的(理由是并非所有平台都会有合适的GPU),但我希望人们已经尝试过,或者知道RenderScript Compute是否可以在Android平台上运行。

  • 问题内容: 如果我在Java中这样做: 在开始或每个循环迭代中是否仅调用一次一次昂贵的ListGeneration()? 是否依赖于实现? 问题答案: 因为它等效于使用迭代器,所以等效于调用collections。iterator()方法,它被调用一次。

  • 具有获取分类指标的强大功能,尽管我认为缺少的是在给定预测和实际标签序列的情况下返回TP、FN、FP和FN计数的函数。甚至从混淆矩阵。 我知道可以使用获取混淆矩阵,但我需要实际的TP、FN、FP和FN计数(对于多标签分类-超过2个标签),并为每个类获取这些计数。 比如说,我有下面的混淆矩阵和3个类。是否有一些包可以从中获取每个类的计数?我什么也找不到。

  • 如何计算文本更改了多少? 例如以下文本: 与 这里的变化很小(末尾增加了x) 下面的变化很大: (此处我添加了“更多文本”) 我想到了测量字符串长度,并用它来计算变化百分比。但这种方法在以下情况下会出现问题: (几乎相同的长度,但完全不同的文本) 我怀疑很多人遇到了这个问题。但我似乎在谷歌上找不到太多,可能是因为不知道这项技术的名称是什么,它可以测量文本的变化。