的代碼只有幾個街區:斯威夫特初始化器神祕
這工作:
import Foundation
class Class1 {
init(param1: String?) {
print("hello")
}
convenience init() {
self.init(param1: nil)
}
}
class SubClass1: Class1 {
}
let obj = SubClass1()
在上面的代碼中,指定初始化器傳遞到SubClass1因爲SubClass1不提供自己的指定初始化器。另外,方便初始化者也傳遞下來。因此,這工作。
import Foundation
class Class1 {
init(param1: String?) {
print("hello")
}
convenience init() {
self.init(param1: nil)
}
}
class SubClass1: Class1 {
override init(param1: String?) {
print("hello 2")
super.init(param1: nil)
}
}
let obj = SubClass1()
這也適用,因爲SubClass1現在已經提供了自己的指定初始化程序。
import Foundation
class Class1 {
init(param1: String?) {
print("hello")
}
init(param2: String?) {
print("world")
}
convenience init() {
self.init(param1: nil)
}
}
class SubClass1: Class1 {
override init(param1: String?) {
print("hello 2")
super.init(param1: nil)
}
}
let obj = SubClass1()
這給出了「錯誤:最後一行的參數'param1'在調用中缺少參數」。 在這裏,SubClass1有一個指定的初始化程序,而Parent的便捷初始化程序也會調用相同的初始化程序,那麼爲什麼會出現錯誤?
這
import Foundation
class Class1 {
init(param1: String?) {
print("hello")
}
required init(param2: String?) {
print("world")
}
convenience init() {
self.init(param1: nil)
}
}
class SubClass1: Class1 {
override init(param1: String?) {
print("hello 2")
super.init(param1: nil)
}
required init(param2: String?) {
print("world")
super.init(param2: nil)
}
}
let obj = SubClass1()
和這個作品:
import Foundation
class Class1 {
init(param1: String?) {
print("hello")
}
init(param2: String?) {
print("world")
}
convenience init() {
self.init(param1: nil)
}
}
class SubClass1: Class1 {
override init(param1: String?) {
print("hello 2")
super.init(param1: nil)
}
override init(param2: String?) {
print("world")
super.init(param2: nil)
}
}
let obj = SubClass1()
爲什麼它需要所有的指定initialisers被覆蓋在一個方便初始化器工作調用只是指定initialisers之一?