先看一下踩坑的代码:
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
}
}
}
