我试图理解为什么Swift强制执行符合协议的类,并将初始化程序标记为必需 . 这实质上强制任何子类也实现该初始化器 . 当然,指定的超类初始化程序将被继承?
您可以将符合类的协议初始化程序要求实现为指定的初始值设定项或便捷初始值设定项 . 在这两种情况下,您必须使用required修饰符标记初始化程序实现:
class SomeClass: SomeProtocol {
required init(someParameter: Int) {
// initializer implementation goes here
}
}
class SomeSubclass: SomeClass {
required init(someParameter: Int) { // enforced to implement init again
// initializer implementation goes here
}
}
使用required修饰符可确保在符合类的所有子类上提供初始化程序需求的显式或继承实现,以便它们也符合协议 .
EDIT: 我最初没有提到我目前仅限于Swift 2.1 . 它似乎是此版本中的编译器问题,并且在更高版本中不会发生 .
2 回答
不,不总是 . 如果子类定义了自己的指定初始化器,那么它将不会自动继承超类的指定初始化器 . 请考虑以下示例:
由于
Bar
定义了自己的init(str:)
指定初始化程序,因此它不会自动继承Foo
的指定初始化程序init()
. 这可以防止在子类声明其自己的存储属性的情况下进行不安全的初始化 .将
init()
标记为required
强制Bar
具有init()
,无论是通过提供自己的实现:或者通过继承
Foo
的实现(当Bar
没有定义自己的指定初始化器时):您没有强制在子类中实现初始化程序 . 考虑这个例子,编译得很好: