我有一个让我真正困惑的事情,特别是以下代码触发了编译器错误“ 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。在swift- evolution邮件列表中提到了这一点,但是我无法解释 为什么 这样做是必要的。
self
用
lazy var first: FirstClass = FirstClass(second: self) // ^^^^^^^^^^^^
您的代码将按预期编译并运行。
这是另一个示例,它说明structs 也发生了问题,即与子类无关。
struct
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且不需要类型注释。的初始值z1/z2取决于self,并且仅使用显式类型注释进行编译。
y
z1/z2
更新: 在Swift 4 / Xcode 9 beta 3中已修复此问题,惰性属性初始化程序现在可以引用实例成员self,而无需显式和无显式类型注释。(感谢@hamish进行更新。)