我试图理解为什么Swift强制执行一个符合协议的类,并根据需要标记一个初始化器。这实际上强制所有子类也实现该初始化器。指定的超类初始化器肯定会被继承吗?
以下引文摘自Swift语言指南:ref/doc/uid/TP40014097-CH25-ID272
您可以将协议初始化器需求作为指定的初始化程序或方便的初始化器实现在符合标准的类上。在这两种情况下,必须用所需的修饰符标记初始化器实现:
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
}
}使用所需的修饰符确保在一致性类的所有子类上提供初始化器需求的显式或继承实现,使它们也符合协议。
编辑:我最初没有提到我目前仅限于SWIFT2.1。在这个版本中,它似乎是一个编译器问题,在以后的版本中没有出现。
发布于 2017-02-22 17:15:17
指定的超类初始化器肯定会被继承吗?
不,不总是这样。如果子类定义了自己的指定初始化符,那么它将不会自动继承超类的指定初始化符。请考虑以下示例:
class Foo {
init() {}
}
class Bar : Foo {
var str: String
init(str: String) {
self.str = str
}
}
let b = Bar() // illegal – what value would the 'str' property have?由于Bar定义了自己的init(str:)指定初始化器,所以它不会自动继承Foo指定的初始化器init(),这样可以防止子类声明自己存储的属性时的不安全初始化。
将init()标记为required强制执行Bar有一个init(),尽管它提供了自己的实现:
class Foo {
required init() {}
}
class Bar : Foo {
var str: String
init(str: String) {
self.str = str
}
// implement required init(), as Bar defines its own designated initialiser.
required init() {
self.str = "foo" // now str is correctly initialised when calling init()
}
}
let b = Bar() // now legal或者通过继承Foo的实现(当Bar没有定义自己指定的初始化程序时):
class Foo {
required init() {}
}
class Bar : Foo {
// inherits init() from Foo, as Bar doesn't define its own designed initialisers.
}
let b = Bar() // legal发布于 2017-02-22 16:50:02
您没有强制在子类中实现初始化器。考虑一下这个示例,它编译得很好:
protocol SomeProtocol {
init(someParameter: Int)
}
class SomeClass: SomeProtocol {
required init(someParameter: Int) {
// initializer implementation goes here
print(someParameter)
}
}
class SomeSubclass: SomeClass {
// Notice that no inits are implemented here
}
_ = SomeClass(someParameter: 123)
_ = SomeSubclass(someParameter: 456)https://stackoverflow.com/questions/42397348
复制相似问题