使用self进行Swift延迟实例化



我有一些真正让我困惑的东西,特别是下面的代码触发编译器错误"未解析的标识符自我",我不确定为什么会发生这种情况,因为懒惰意味着在使用属性的时候,类已经实例化了。我错过什么了吗?

提前感谢。

代码

class FirstClass {
    unowned var second: SecondClass
    init(second:SecondClass) {
        self.second = second
        print("First reporting for duty")
    }
    func aMethod() {
        print("First's method reporting for duty")
    }
}

class SecondClass {
    lazy var first = FirstClass(second: self)
    func aMethod() {
        first.aMethod()
    }
}

由于某种原因,lazy属性需要显式类型注释初始值为self。这在快速发展的邮件列表中提到过,但是我无法解释为什么会这样必要的。

lazy var first: FirstClass = FirstClass(second: self)
//            ^^^^^^^^^^^^

您的代码将按预期编译并运行。

下面是另一个例子,说明这个问题发生了也与struct s,即它与子类无关:

func foo(x: Int) -> Int { return x + 1 }
struct MyClass {
    let x = 1
    lazy var y = foo(0)            // No compiler error
    lazy var z1 = foo(self.x)      // error: use of unresolved identifier 'self'
    lazy var z2: Int = foo(self.x) // No compiler error
}

y的初值不依赖于self,不需要a注释类型。z1/z2的初始值取决于self,而且它只能使用显式类型注释进行编译。

更新:这个问题已经在Swift 4/Xcode 9 beta 3中修复。惰性属性初始化器现在可以在没有显式self和显式类型注释的情况下引用实例成员。(感谢@hamish的更新)

最新更新