Swift lazy instantiating using self(使用 self 进行 Swift 惰性实例化)
问题描述
我有一些让我很困惑的事情,特别是以下代码触发了编译器错误未解析的标识符自身",我不确定为什么会发生这种情况,因为惰性意味着在使用该属性时,该类已经实例化了.我错过了什么吗?
I have something that really puzzles me, specifically the following code triggers a compiler error "unresolved identifier self", and I am not sure why this is happening, as lazy means that at the time the property will be used, the class is already instantiated. Am I missing something?
提前非常感谢.
这里是代码
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 邮件列表,但是我无法解释 为什么必要的.
For some reason, a lazy property needs an explicit type annotation if its
initial value refers to self. This is mentioned on the swift-evolution mailing list, however I cannot explain why that is
necessary.
有
lazy var first: FirstClass = FirstClass(second: self)
// ^^^^^^^^^^^^
您的代码按预期编译和运行.
your code compiles and runs as expected.
这是另一个例子,它证明了问题的发生也与 structs,即它与子类无关:
Here is another example which demonstrates that the problem occurs
also with structs, i.e. it is unrelated to subclassing:
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,并且只能使用显式类型注释进行编译.
The initial value of y does not depend on self and does not need a
type annotation. The initial values of z1/z2 depend on self,
and it compiles only with an explicit type annotation.
更新:这个已在 Swift 4 中修复/Xcode 9 测试版 3,惰性属性初始化器现在可以在没有显式 self 和显式类型注释的情况下引用实例成员.(感谢@hamish 的更新.)
Update: This has been fixed in Swift 4/Xcode 9 beta 3,
lazy property initializers can now reference instance members without explicit self, and without explicit type annotation. (Thanks to @hamish for the update.)
这篇关于使用 self 进行 Swift 惰性实例化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:使用 self 进行 Swift 惰性实例化
基础教程推荐
- 如何将图像从一项活动发送到另一项活动? 2022-01-01
- iOS - UINavigationController 添加多个正确的项目? 2022-01-01
- SwiftUI-ScrollViewReader的ScrollTo不滚动 2022-01-01
- Android Volley - 如何动画图像加载? 2022-01-01
- 如何比较两个 NSDate:哪个是最近的? 2022-01-01
- navigationItem.backBarButtonItem 不工作?为什么上一个菜单仍然显示为按钮? 2022-01-01
- Play 商店的设备兼容性问题 2022-01-01
- Xcode UIView.init(frame:) 只能在主线程中使用 2022-01-01
- UIImage 在开始时不适合 UIScrollView 2022-01-01
- 为什么姜饼模拟器方向卡在应用程序中? 2022-01-01
