子类有指定初始化器时,能否继承父类的便利初始化器?
问题解答
1. 为什么B(ageString: "1")会报错?
核心原因是子类自定义指定初始化器后,默认不会继承父类的便利初始化器。
Swift的初始化继承规则明确:当子类定义了自己的指定初始化器时,就失去了自动继承父类指定初始化器的资格;而父类的便利初始化器只有在子类实现了父类所有指定初始化器(不管是自己写的还是继承来的)的前提下,才会被继承。
你的B类自定义了指定初始化器init(name:),但完全没实现父类A的指定初始化器init(age:),所以父类扩展里的init?(ageString:)这个便利初始化器不会被B继承,自然调用时会提示初始化器不存在。
2. 扩展中能不能定义非便利初始化器?
不行,Swift不允许在类的扩展中添加指定初始化器,只能定义便利初始化器。指定初始化器必须放在类的主定义(也就是class A { ... }的大括号中)声明,扩展只能用来给类添加便利初始化器、方法、计算属性等内容。
3. 子类有指定初始化器时,不会继承父类的便利初始化器吗?
是的,默认不会,除非满足以下两个条件之一:
- 子类实现了父类所有的指定初始化器(不管是自己编写的,还是通过继承得到的);
- 子类被标记为
final类(无法被继承的类)。
你的B类既没实现父类的init(age:),也不是final类,所以父类的便利初始化器不会被继承。
内容的提问来源于stack exchange,提问作者xarly
相关产品推荐
相关产品推荐

