对于UIView子类,如果我们用CGRect参数覆盖初始化器,为什么会自动提供带空参数的初始化器?
如果我UIView按以下方式覆盖,我没有带空参数的初始化程序。
class A: UIView {
required init?(coder: NSCoder) {
super.init(coder: coder)
}
}
// Error. Initializer with empty argument not supported
let a = A()
但是,如果我UIView在下面重写,我可以获得一个带有空参数的初始化程序?
class A: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder: NSCoder) {
super.init(coder: coder)
self.backgroundColor = UIColor.clear
}
}
// Why I can get a "free" init with empty argument?
let a = A()
乍一看,对于UIView子类,如果我们用CGRect参数覆盖初始化器,似乎会自动提供一个带空参数的初始化器。
我可以知道这是怎么发生的吗?
回答
这在Swift Guide 中有非常明确的说明:
规则1
如果您的子类没有定义任何指定的初始值设定项,它会自动继承其所有超类指定的初始值设定项。
规则 2
如果您的子类提供了其所有超类指定初始值设定项的实现(通过按照规则 1 继承它们,或通过提供自定义实现作为其定义的一部分),则它会自动继承所有超类便利初始值设定项。
init(frame:)是 的指定初始值设定项UIView。通过覆盖它们,您的子类继承了无参数的说服初始化程序。
THE END
二维码