我认为这两个类符合继承初始化程序的规则:
class Butt1 : UIButton {}
class Butt2<T> : UIButton {}
let butt1 = Butt1() // ok
let butt2 = Butt2<Void>() // error: no accessible initializer
文档说:
如上所述,子类不会继承它们的超类 默认情况下初始化程序但是,超类初始化器是 如果满足某些条件,则自动继承。在实践中, 这意味着您不需要在许多中编写初始化程序覆盖 常见场景,可以继承你的超类初始化器 只要安全就可以做到最小的努力。
假设您为任何新属性提供默认值 在子类中引入,适用以下两个规则:
规则1 如果您的子类未定义任何指定的初始值设定项,则为 自动继承其所有超类指定的初始化器。
规则2 如果您的子类提供了所有子类的实现 超类指定初始化程序 - 通过按照继承它们 规则1,或通过提供自定义实现作为其一部分 定义 - 然后它自动继承所有的超类 便利初始化者。
在Butt2
的情况下,编译器不认为“这样做是安全的”,但为什么不安全呢?