采用以下示例:
class A {
var num: Int
required init(num: Int) {
self.num = num
}
}
class B: A {
func haveFun() {
println("Woo hoo!")
}
}
我已将A
的{{1}}功能标记为init
。这到底是什么意思?我在子类required
中完全省略了它,并且编译器根本没有抱怨。那怎么样呢?
答案 0 :(得分:29)
请参阅"Automatic Initializer Inheritance":
规则1 如果您的子类未定义任何指定的初始值设定项,则为 自动继承其所有超类指定的初始化器。
规则2 如果您的子类提供了所有子类的实现 超类指定初始化程序 - 通过按照继承它们 规则1,或通过提供自定义实现作为其一部分 定义 - 然后它自动继承所有的超类 便利初始化者。
在您的示例中,子类B
没有自己定义任何初始值设定项,因此它
从A
继承所有初始值设定项,包括所需的初始值设定项。
如果B
仅定义了便利初始化器,则情况也是如此
(现已针对 Swift 2 进行了更新):
class B: A {
convenience init(str : String) {
self.init(num: Int(str)!)
}
func haveFun() {
print("Woo hoo!")
}
}
但是如果子类定义了任何指定的(=非便利)初始化器,那么它 不再继承超类初始值设定项。特别是要求 初始化程序不是继承的,所以这不会编译:
class C: A {
init(str : String) {
super.init(num: Int(str)!)
}
func haveFun() {
print("Woo hoo!")
}
}
// error: 'required' initializer 'init(num:)' must be provided by subclass of 'A'
如果您从required
的init方法中移除A
,那么请{class 1}}
编译也是如此。
答案 1 :(得分:26)
required
关键字表示继承类必须提供该方法的实现。但是,该语言使所需的初始化程序成为例外:
如果可以使用继承的初始化程序满足要求,则不必提供所需初始化程序的显式实现。
答案 2 :(得分:2)
“使用必需的修饰符可确保您在符合类的所有子类上提供初始化程序要求的显式或继承实现,以便它们也符合协议。”
摘自:Apple Inc.“Swift编程语言(Swift 2)。”iBooks。 https://itun.es/us/jEUH0.l