Swift懒惰实例化使用self

Raz*_*riu 13 initialization lazy-initialization swift

我有一些让我感到困惑的东西,特别是下面的代码触发编译器错误"unresolved identifier self",我不知道为什么会发生这种情况,因为lazy意味着在使用该属性时,该类已经被实例化.我错过了什么吗?

提前谢谢了.

这是代码

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()
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*n R 19

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

同

lazy var first: FirstClass = FirstClass(second: self)
//            ^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

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

这是另一个示例,它表明问题也发生在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
}
Run Code Online (Sandbox Code Playgroud)

初始值y不依赖于self,也不需要类型注释.z1/z2依赖的初始值self,它仅使用显式类型注释进行编译.

更新:这已在Swift 4/Xcode 9 beta 3中得到修复,懒惰属性初始化器现在可以在没有显式的情况下引用实例成员self,并且没有显式类型注释.(感谢@hamish的更新.)

  • 值得庆幸的是,这个怪癖[已在Swift 4中修复](https://github.com/apple/swift/pull/9920)(特别是随Xcode 9 beta 3一起提供的版本):) (2认同)