Swift 在调用 super.init 之前必须初始化变量

Oct 10, 2022 • 预计阅读时间 1 分钟

先看一下踩坑的代码:

public class MyView: UIView {
    private var count = 0

    public init(count: Int) {
        super.init(frame: .zero)
        self.count = count
    }

    // 重写 setFrame 方法
    override public var frame: CGRect {
        didSet {
            let w = frame.width * count
        }
    }
}

以上示例中,count 属性是在 super.init(frame:) 之后才赋值, 但是由于重写了 frame 属性的 didSet 方法,而且在其中使用到了 count 属性, 这样就导致了一个隐含的 BUG:在初始化方法中触发的 frame 的 didSet 方法里使用的 count 属性的值是 0 而不是外部传进来的值。

要避免这类问题发生,推荐的做法是在调用任何的 super.init 初始化方法之前先给属性赋值。

修正后的代码:

public class MyView: UIView {
    private var count = 0

    public init(count: Int) {
        self.count = count // 在 super.init 之前先赋值
        super.init(frame: .zero)
    }

    // 重写 setFrame 方法
    override public var frame: CGRect {
        didSet {
            let w = frame.width * count
        }
    }
}
Swift
版权声明:如果转发请带上本文链接和注明来源。

lvv.me

iOS/macOS Developer

使用低版本 Xcode 在新版本 iOS 上开启调试

C++ 11 中的原始字符串字面量(Raw String Literal)