在 UIView
的子类中,我声明了一个属性。此属性是 UIPanGestureRecognizer
的一个实例,不是可选的或隐式展开的。这是代码:
class DraggableView: UIView {
let panGestureRecognizer: UIPanGestureRecognizer
override init() {
panGestureRecognizer = UIPanGestureRecognizer(target: self, action: "dragged:")
super.init()
backgroundColor = UIColor.greenColor()
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
在 panGestureRecognizer
的初始化行中,Xcode 给出了一个错误:“self used before super.init call”。如果我将 super.init()
行移动到 panGestureRecognizer
初始化行上方,Xcode 会给出另一个错误:“Property self.panGestureRecognizer
not initialized at super.init
调用”。最后一次尝试是在 init
方法之外的声明中初始化 panGestureRecognizer
。像这样:
let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: "dragged:")
这里 Xcode 给出了另一个错误:“Type DraggableView -> () -> DraggableView!
does not conform to protocol AnyObject
”
有没有办法在不使用可选值或隐式解包可选值的情况下完成这项工作?
最佳答案
问题是 self
在 super.init()
发生之前不存在。
您可以分两步创建它 - 在声明时初始化:
let panGestureRecognizer = UIPanGestureRecognizer()
然后在super.init()
之后,添加目标:
panGestureRecognizer.addTarget(self, action: "dragged:")
或者,您可以将其设置为 lazy var
,但我不喜欢设置变量,除非它们应该变化。
关于Swift 初始化悖论,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27667069/