使用惰性变量时编译错误

时间:2016-07-20 05:06:21

标签: ios 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 - >() - >测试'没有成员'我'”

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

2 个答案:

答案 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'的帮助下调用它时。将指向同一个对象,自我赢得没有赢得任何问题。

总之,你需要了解两件事情

  • 在声明lazy var时,您必须指定数据类型
  • lazy var在声明时未分配,它在分配时分配 被称为
  • 如果没有类的实例(对象),则无法调用实例var

答案 1 :(得分:0)

以下是使用视图控制器进行延迟初始化的示例

注意最后的()

lazy var myViewController : MyViewController? = {
    let storyboard: UIStoryboard = UIStoryboard(name: "MyVC", bundle: nil)
    return storyboard.instantiateViewController(withIdentifier: "MyAccount") as? MyViewController
}()