Swift 初始化悖论

标签 swift initialization

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/

相关文章:

python - 快速通过套接字发送整数

swift - 如何在 SwiftUI 应用程序生命周期中更改特定 View 的状态栏颜色?

c++ - 为什么值初始化如此命名?

c++ - 如何使用类似 Type() 的语法对 Type* 指针进行值初始化?

C++ 初始化类成员构造函数

ios - 无法从 UITabBar 快速获取 UIImageView

ios - Swift iOS 图表 - 隐藏某些条形图值标签

core-data - 可以在 Swift Playground 中使用 Core Data 吗?

c - 字符数组和整型数组的区别

c++ - 类内初始化顺序与构造函数初始化列表