Swift 使用 self 进行惰性实例化
Swift lazy instantiating using self
我有一些事情真的让我很困惑,特别是下面的代码触发了一个编译器错误"unresolved identifier self",我不确定为什么会这样,因为懒惰意味着当时 属性将被使用,class 已经实例化。我错过了什么吗?
非常感谢。
这是代码
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 mailing list 中提到了这一点,但是我无法解释 为什么 那是
必要的。
有
lazy var first: FirstClass = FirstClass(second: self)
// ^^^^^^^^^^^^
您的代码按预期编译和运行。
这是另一个证明问题发生的例子
也有 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
,不需要a
类型注解。 z1/z2
的初始值取决于 self
,
并且它仅使用显式类型注释进行编译。
更新: 这个 has been fixed 在 Swift 4/Xcode 9 beta 3,
惰性 属性 初始值设定项现在可以在没有显式 self
且没有显式类型注释的情况下引用实例成员。 (感谢@hamish 的更新。)
我有一些事情真的让我很困惑,特别是下面的代码触发了一个编译器错误"unresolved identifier self",我不确定为什么会这样,因为懒惰意味着当时 属性将被使用,class 已经实例化。我错过了什么吗?
非常感谢。
这是代码
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 mailing list 中提到了这一点,但是我无法解释 为什么 那是
必要的。
有
lazy var first: FirstClass = FirstClass(second: self)
// ^^^^^^^^^^^^
您的代码按预期编译和运行。
这是另一个证明问题发生的例子
也有 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
,不需要a
类型注解。 z1/z2
的初始值取决于 self
,
并且它仅使用显式类型注释进行编译。
更新: 这个 has been fixed 在 Swift 4/Xcode 9 beta 3,
惰性 属性 初始值设定项现在可以在没有显式 self
且没有显式类型注释的情况下引用实例成员。 (感谢@hamish 的更新。)