斯威夫特懒惰使用自我实例化

我有一些令我感到困惑的东西,特别是下面的代码触发了一个编译器错误“unresolved identifier self”,我不确定为什么会这样,懒惰的意思是在那个属性被使用的时候,这个类已经被实例化了。 我错过了什么吗?

提前谢谢了。

这是代码

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() } } 

出于某种原因,如果一个懒惰属性的初始值指向self那么它需要显式的types注释。 这是在迅速发展的邮件列表中提到的,但我不能解释为什么这是必要的。

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

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

这里是另一个例子,它certificate了这个问题也出现在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 ,不需要types注释。 z1/z2的初始值取决于self ,并且只用明确的types注释进行编译。

更新:这已经在Swift 4 / Xcode 9 beta 3中得到了修复 ,懒惰属性初始值设定项现在可以引用实例成员而没有明确的self ,也没有明确的types注释。 (感谢@hamish的更新。)