我想提请注意Required 提供的另一个解决方案,除了上面给出的马特。
class superClass{
var name: String
required init(){
// initializer implementation goes here
self.name = "Untitled"
}
}
class subClass: superClass {
var neakName: String = "Subclass Untitled"
}
let instanceSubClass = subClass()
instanceSubClass.name //output: "Untitled"
instanceSubClass.neakName //output: "Subclass Untitled"
正如你可以在上面的例子中看到的,我在superClass上声明了required init(),超类的init()初始化器默认继承在subClass上,所以你可以创建一个子类let instanceSubClass = subClass()的实例.
但是,假设您想在子类上添加一个指定的初始化程序,以将运行时值分配给存储的属性neakName。当然你可以添加它,但这会导致超类的初始化器不会被继承到子类,所以如果你要创建一个subClass的实例,你将通过它自己指定的初始化器来创建以下。
class superClass{
var name: String
init(){
// initializer implementation goes here
self.name = "Untitled"
}
}
class subClass: superClass {
var neakName: String = "Subclass Untitled"
init(neakName: String) {
self.neakName = neakName
}
}
let instanceSubClass = subClass(neakName: "Bobby")
instanceSubClass.name //output: "Untitled"
instanceSubClass.neakName //output: "Bobby"
在上面,您将无法仅通过 subClass() 创建 subClass 的实例,但是如果您希望 superClass 的每个子类都必须有自己的 init() 初始化器通过subClass() 创建直接实例。只需在超类上的init() 之前放置required 关键字,它会强制您在subClass 上添加init() 初始化程序 - 如下所示。
class superClass{
var name: String
required init(){
// initializer implementation goes here
self.name = "Untitled"
}
}
class subClass: superClass {
var neakName: String = "Subclass Untitled"
init(neakName: String) {
self.neakName = neakName
}
} // Compiler error <------------ required `init()` must be provided by subClass.
let instanceSubClass = subClass(neakName: "Bobby")
instanceSubClass.name //output: "Untitled"
instanceSubClass.neakName //output: "Bobby"
所以,在超类的初始化程序之前使用 required 关键字,当您希望所有子类都必须已实现超类的 required initializer 时。