对于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。通过覆盖它们,您的子类继承了无参数的说服初始化程序。


以上是对于UIView子类,如果我们用CGRect参数覆盖初始化器,为什么会自动提供带空参数的初始化器?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>