gpt4 book ai didi

ios - 使用惰性变量时的编译错误

转载 作者:搜寻专家 更新时间:2023-10-30 23:09:36 24 4
gpt4 key购买 nike

我想了解 lazy 在 swift 中是如何工作的。下面的代码编译没有任何错误。

import UIKit
class Test : UIViewController{
let i = 1
lazy var j:Int = self.i
}

而如果我删除 j 的类型并像下面的代码那样推断它,

import UIKit
class Test : UIViewController{
let i = 1
lazy var j = self.i
}

我收到编译错误“'NSObject -> () -> Test' 类型的值没有成员 'i'”

谁能解释一下编译器是怎么回事。谢谢

最佳答案

你需要在这里考虑 3 个方面。

  • 惰性存储属性的初始值不是计算直到第一次使用它。那是你打电话的时候将首次计算该属性的值。
  • 由于实际值是由评估创建的,因此您需要声明惰性变量的数据类型在前面。
  • 您在类中声明的属性是实例变量,如果您需要访问它们的值,则需要一个实例(对象)类(class)。

让我们考虑下你的非工作代码中的行

lazy var j =  self.i

您的非工作代码中存在两个问题。首先是您没有指定惰性变量的数据类型。由于声明不完整,编译器不会将“j”视为惰性变量,而是将其视为普通实例变量。您必须了解 swift 的规则,即无论何时在类中声明任何变量,都必须为其分配一些值,否则您可以将该变量设为可选。在上面的语句中,您试图通过在类中使用 self 将 i 的值分配给 j。当编译器编译该行时,没有创建类的对象并且您使用的 self 为 nil 这就是编译器抛出错误的原因(即使您由于上述相同原因不使用 self 也会抛出错误) .

为什么它不会在您的工作代码中引起问题:

lazy var j:Int =  self.i

正如我在上面提到的,惰性变量的值是在您调用该变量时分配的。您将如何在类外调用该变量?当然是通过创建对象。当您在对象的帮助下调用它时,“self”将指向同一个对象并且 self 不会为 nil,这不会导致任何问题。

简而言之,你需要了解 3 件事中的两件事

  • 声明惰性变量时必须指定数据类型
  • lazy var 声明时不赋值,声明时赋值被称为
  • 你不能在没有你的类的实例(对象)的情况下调用实例变量

关于ios - 使用惰性变量时的编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38472708/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com