我试图了解懒惰是如何工作的.以下代码编译时没有任何错误.
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 - >() - >测试'没有成员'我'"
有人可以解释编译器发生了什么.谢谢
这里你需要考虑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 不会为零,它不会导致任何问题。
简而言之,你需要了解两件事,三件事
| 归档时间: |
|
| 查看次数: |
530 次 |
| 最近记录: |