请看以下示例:
class A {
var num: Int
required init(num: Int) {
self.num = num
}
}
class B: A {
func haveFun() {
println("Woo hoo!")
}
}
Run Code Online (Sandbox Code Playgroud)
我把它A的init功能标记为required.这到底是什么意思?我在子类中完全省略了它,B编译器根本没有抱怨.那怎么样呢?
Mar*_*n R 29
请参见"自动初始化程序继承":
规则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!")
}
}
Run Code Online (Sandbox Code Playgroud)
但是如果子类定义了任何指定的(=非方便的)初始化器,那么它就不再继承超类初始化器.特别是所需的初始化程序不是继承的,因此不能编译:
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'
Run Code Online (Sandbox Code Playgroud)
如果你删除了requiredfrom A的init方法,那么类C
也会编译.
| 归档时间: |
|
| 查看次数: |
12849 次 |
| 最近记录: |