为何必须编写required init() {}?Swift编译错误解析
问题
编译时报错:Constructing an object of class type 'Self' with a metatype value must use a 'required' initializer,完整代码如下:
class ParentFactory { static func create() -> Self { return self.init() } // required init(){} func printMessage() { print("Super") } } class Child1Factory: ParentFactory { override func printMessage() { print("1 Class") } } class Child2Factory: ParentFactory { override func printMessage() { print("2 Class") } } class Factory { static func createFactory(_ type: String) -> ParentFactory { if type == "1" { return Child1Factory.create() } else { return Child2Factory.create() } } }
添加required init() {}后错误消失,不解为何即使该初始化器无任何代码,也必须编写它。
原因解析
- 静态方法中
Self的类型约束:静态方法create()返回Self,意味着调用该方法时(比如子类Child1Factory.create())必须返回当前调用者类型的实例。这里的self.init()中的self是当前类的元类型,可能是父类或任意子类。 - 强制子类实现初始化器:Swift中,子类默认不会自动继承父类的无参初始化器,除非子类未定义任何指定初始化器。而
required关键字的核心作用是强制所有子类必须提供该初始化器的实现,确保父类的静态方法在任何子类上调用时,都能找到合法的初始化器来创建实例。 - 空实现的必要性:哪怕
required init() {}没有实际代码,它也完成了两个关键作用:一是父类明确声明该初始化器是子类的必实现项;二是如果子类没有自定义初始化器,会自动继承这个空实现,保证create()方法中self.init()的调用在所有子类上都合法,不会出现找不到初始化器的编译错误。
内容的提问来源于stack exchange,提问作者Yoonjong Lee
相关产品推荐
相关产品推荐

