【发布时间】:2015-06-20 07:49:48
【问题描述】:
以下类具有声明为隐式展开变量的“let”属性。这以前适用于 Xcode 6.2:
class SubView: UIView {
let pandGestureRecognizer: UIPanGestureRecognizer!
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.pandGestureRecognizer = UIPanGestureRecognizer(target: self, action: "panAction:")
}
func panAction(gesture: UIPanGestureRecognizer) {
// ...
}
}
更新到 Xcode 6.3(使用 Swift 1.2)后,出现以下编译错误:
Property 'self.panGestureRecognizer' not initialized at super.init call
Immutable value 'self.panGestureRecognizer' may only be initialized once
在super.init 调用之前移动以下行:
self.pandGestureRecognizer = UIPanGestureRecognizer(target: self, action: "panAction:")
给出以下错误:
'self' is used before super.init call
属性“panGestureRecognizer”不需要突变,因此必须将其声明为常量“let”。由于它是一个常量,因此它必须在声明时具有初始值,或者在init 方法中对其进行初始化。要初始化它,它需要在'target'参数中传递'self'。
其他线程建议将其声明为隐式解包可选,并在super.init 调用之后对其进行初始化。这在我更新到 Xcode 6.3 之前一直有效。
有人知道这种情况的正确实现或解决方法吗?
【问题讨论】:
-
这看起来像是该语言的实现,甚至是规范中的一个错误。向 Apple 提交错误报告是个好主意。不幸的是,当您注册对一种恰好相对复杂的全新编程语言进行 beta 测试时,您就会得到这样的结果。
-
它不必声明为常量 let。实际上,如果您要在文件顶部将其声明为可选项,则需要将其声明为 var,以便在 init 方法中对其进行实例化。
-
@rdelmar 你可以声明 let 变量,它只是强制它们在 super.init 之前被实例化。