以下是Swift教程的a link。 在初始化 - 覆盖可用的初始化程序部分中 请注意,如果使用不可用的子类初始值设定项覆盖可用的超类初始值设定项,则子类初始值设定项不能委托超类初始值设定项。
但是下面的例子:
class Document {
var name: String?
// this initializer creates a document with a nil name value
init() {}
// this initializer creates a document with a non-empty name value
init?(name: String) {
if name.isEmpty { return nil }
self.name = name
}
}
和
class AutomaticallyNamedDocument: Document {
override init() {
super.init()
self.name = "[Untitled]"
}
// This is nonfailable override superclass's failable
override init(name: String) {
// Why subclass initializer still can delegate up to the superclass initializer??
super.init()
if name.isEmpty {
self.name = "[Untitled]"
} else {
self.name = name
}
}
}
子类初始值设定项无法委托超类初始值设定项 为什么子类初始化程序仍然可以委托超类初始化程序?
答案 0 :(得分:5)
该段落意味着您无法委派重写的可用初始化程序。请注意前面的这段话:
类,结构或枚举的可用初始化程序可以从同一个类,结构或枚举委托给另一个可用的初始化程序。类似地,子类可用的初始化程序可以委托一个超类可用的初始化程序。
在任何一种情况下,如果您委托另一个导致初始化失败的初始化程序,整个初始化过程会立即失败,并且不会执行进一步的初始化代码。
这应该明确为什么你不能委托给被覆盖的可用初始化器 - 如果它真的失败了,整个初始化过程就会失败,但是你处于非的中间可用的初始化程序。
在你的情况下,你要委托超类(super.init()
)的一个不可用的初始值设定项,所以没有问题。