使用惰性变量时编译错误

Nav*_*han 5 ios swift

我试图了解懒惰是如何工作的.以下代码编译时没有任何错误.

import UIKit
class Test : UIViewController{
    let i = 1
    lazy var j:Int =  self.i
}
Run Code Online (Sandbox Code Playgroud)

如果我删除j的类型并按下面的代码推断,

import UIKit
class Test : UIViewController{
    let i = 1
    lazy var j =  self.i
}
Run Code Online (Sandbox Code Playgroud)

我得到编译错误"类型的值'NSObject - >() - >测试'没有成员'我'"

有人可以解释编译器发生了什么.谢谢

SZ.*_*SZ. 4

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

  • 惰性存储属性是指直到第一次使用时才计算其初始值的属性。也就是说,当您第一次调用该属性时,将计算其值。
  • 由于实际值是通过求值创建的,因此您需要预先声明惰性变量的数据类型。
  • 您在类中声明的属性是实例变量,如果您需要访问它们的值,您需要类的实例(对象)。

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

lazy var j =  self.i
Run Code Online (Sandbox Code Playgroud)

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

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

lazy var j:Int =  self.i
Run Code Online (Sandbox Code Playgroud)

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

简而言之,你需要了解两件事,三件事

  • 声明惰性变量时,您必须指定数据类型
  • lazy var 声明时不赋值,调用时赋值
  • 如果没有类的实例(对象),则无法调用实例 var

  • 如果您将任何硬编码值传递给lazy var,则不需要数据类型编译器会理解该类型,这就是lazy var name =“some name”起作用的原因。在您的代码中,您没有直接分配值,而是尝试在 self 的帮助下分配 i 的值。这里编译器不知道 self,i 和 i 的数据类型。这就是为什么在这种情况下以及在编写惰性变量闭包的情况下需要数据类型。 (2认同)