我在swift中有关于初始化程序的查询。根据苹果' Swift3.0
答案 0 :(得分:1)
由于A
中有两个指定的初始化程序,由于签名不同,这些初始化程序不具有歧义,因此可以相互区分。这意味着您可以从子类A
轻松调用B
的相应指定初始值设定项。例如,A
为
class A {
var a: Int
// designated "#1"
init() {
a = 0
}
// designated "#2"
init(_ a: Int) {
self.a = a
}
// convenience initializer for A
convenience init(_ foo: String) {
print(foo)
self.init(42)
}
}
我们有,例如</ p>
class B: A {
let b: Int
// designated "sub#1"
override init() {
b = 42
super.init() // use A's designated #1
}
// designated "sub#2"
override init(_ a: Int) {
b = 24
super.init(a) // use A's designated #2
}
// non-overriding designated "#3"
init(b: Int) {
self.b = b
super.init() // use A's designated #1
}
// convenience initializer for B
convenience init(_ foo: String) {
print(foo)
self.init() // use B's designated #1
}
// you may only call designated initializers of the superclass
}
但请注意,子类的初始值设定项可能仅调用其超类的指定初始值设定项。这由the Language Guide - Initializers - Initializer Delegation for Class Types [强调我的]中的规则1和2涵盖:
类类型的初始化程序委派
简化指定与便利之间的关系 初始化程序,Swift应用以下三个委托规则 初始化程序之间的调用:
规则1
指定的初始化程序必须从其中调用指定的初始值设定项 直接超类。
规则2
便捷初始值设定项必须从中调用另一个初始值设定项 类强>
规则3
便利初始化程序必须最终调用指定的 初始化程序。
因此,您可能无法从A
的便捷初始值设定项访问B
的便捷初始值设定项,B
的指定初始值设定项必须按照上述规则1自然地仅调用指定的A
的初始值设定项。