如果我UIView按以下方式覆盖,我没有带空参数的初始化程序。
class A: UIView {
required init?(coder: NSCoder) {
super.init(coder: coder)
}
}
// Error. Initializer with empty argument not supported
let a = A()
Run Code Online (Sandbox Code Playgroud)
但是,如果我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()
Run Code Online (Sandbox Code Playgroud)
乍一看,对于UIView子类,如果我们用CGRect参数覆盖初始化器,似乎会自动提供一个带空参数的初始化器。
我可以知道这是怎么发生的吗?
这在Swift Guide 中有非常明确的说明:
规则1
如果您的子类没有定义任何指定的初始值设定项,它会自动继承其所有超类指定的初始值设定项。
规则 2
如果您的子类提供了其所有超类指定初始值设定项的实现(通过按照规则 1 继承它们,或通过提供自定义实现作为其定义的一部分),则它会自动继承所有超类便利初始值设定项。
init(frame:)是 的指定初始值设定项UIView。通过覆盖它们,您的子类继承了无参数的说服初始化程序。
| 归档时间: |
|
| 查看次数: |
24 次 |
| 最近记录: |