斯威夫特懒惰使用自我实例化
我有一些令我感到困惑的东西,特别是下面的代码触发了一个编译器错误“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的更新。)