我试图理解懒惰是如何运作的。以下代码编译时没有任何错误。
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 - >() - >测试'没有成员'我'”
有人可以解释编译器发生了什么。感谢
答案 0 :(得分:4)
你需要在这里考虑3个方面。
让我们考虑一下非工作代码中的以下行
lazy var j = self.i
您的非工作代码中存在两个问题。首先,您尚未指定lazy var的数据类型。由于声明不完整,编译器不会对待' j'作为lazy var,它将被视为正常的实例变量。您必须了解swift的规则,即每当您在类中声明任何变量时,您必须为其指定一些值,否则您可以将该变量设置为可选。在上面的陈述中,您试图通过在类中使用self来将i的值赋给j。当编译器正在编译该行时,没有创建该类的对象,并且您正在使用的self是nil,这就是编译器抛出错误的原因(即使您不使用self也会抛出错误,原因与提到的相同)上文)。
为什么它不会导致您的工作代码出现问题:
lazy var j:Int = self.i
正如我上面提到的,当你调用那个变量时,会分配lazy var的值。你如何将这个变量称为类?当然是通过创建对象。当你在对象' self'的帮助下调用它时。将指向同一个对象,自我赢得没有赢得任何问题。
总之,你需要了解两件事情
答案 1 :(得分:0)
以下是使用视图控制器进行延迟初始化的示例
注意最后的()
lazy var myViewController : MyViewController? = {
let storyboard: UIStoryboard = UIStoryboard(name: "MyVC", bundle: nil)
return storyboard.instantiateViewController(withIdentifier: "MyAccount") as? MyViewController
}()