我试图理解为什么 Swift 强制执行一个符合协议的类,并根据需要将初始化程序标记为。这本质上强制所有子类也实现该初始值设定项。指定的超类初始值设定项肯定会被继承吗?
下面的引述摘自《Swift 语言指南》:https://developer.apple.com/library/prerelease/content/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html#//apple_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
}
}
使用 required 修饰符可确保您提供显式的
或继承所有初始化器要求的实现
符合类的子类,这样它们也符合
协议。
EDIT:我最初并没有提到我目前仅限于 Swift 2.1。这似乎是此版本中的编译器问题,在更高版本中不会出现。
指定的超类初始值设定项肯定会被继承吗?
不,并非总是如此。如果子类定义了自己的指定初始化器,那么它不会自动继承超类的指定初始化器。考虑以下示例:
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?
As Bar
定义了自己的init(str:)
指定的初始化器,它不会自动继承Foo
的指定初始值设定项init()
。这可以防止在子类声明其自己的存储属性的情况下进行不安全的初始化。
Marking init()
as required
enforces Bar
has an 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)