一尘不染

Swift懒惰使用self实例化

swift

我有一个让我真正困惑的事情,特别是以下代码触发了编译器错误“ 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()
    }
}

阅读 226

收藏
2020-07-07

共1个答案

一尘不染

由于某种原因,如果惰性属性的初始值引用,则需要显式类型注释self。在swift-
evolution邮件列表中
提到了这一点,但是我无法解释 为什么 这样做是必要的。

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

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

这是另一个示例,它说明structs 也发生了问题,即与子类无关。

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,并且仅使用显式类型注释进行编译。

更新: 在Swift 4 / Xcode 9 beta
3中已修复问题,惰性属性初始化程序现在可以引用实例成员self,而无需显式和无显式类型注释。(感谢@hamish进行更新。)

2020-07-07