gpt4 book ai didi

Swift 初始化悖论

转载 作者:搜寻专家 更新时间:2023-11-01 06:23:56 26 4
gpt4 key购买 nike

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

有没有办法在不使用可选值或隐式解包可选值的情况下完成这项工作?

最佳答案

问题是 selfsuper.init() 发生之前不存在。

您可以分两步创建它 - 在声明时初始化:

let panGestureRecognizer = UIPanGestureRecognizer()

然后在super.init()之后,添加目标:

panGestureRecognizer.addTarget(self, action: "dragged:")

或者,您可以将其设置为 lazy var,但我不喜欢设置变量,除非它们应该变化。

关于Swift 初始化悖论,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27667069/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com