假设我有一个类Dog
声明如下:
class Dog {
let variable1: String
let variable2: Int
init(variable1: String, variable2: Int) {
self.variable1 = variable1
self.variable2 = variable2
}
}
ChowChow
是Dog
的子类,故意声明为空,如下所示:
class ChowChow: Dog {}
所以我们假设现在我想在子类ChowChow
中添加一个初始化器。
我的问题是:为子类ChowChow
创建便利初始化程序之间的区别是什么(<)如果有的话:
class ChowChow: Dog {
convenience init() {
self.init(variable1: "value1", variable2: 2)
}
}
和指定子类ChowChow
的初始值设定项?:
class ChowChow: Dog {
init() {
super.init(variable1: "value1", variable2: 2)
}
}
使用以下测试,我可以看到两种实现的结果相同:
let chowchow = ChowChow()
print(chowchow.variable1) // Prints "value1"
print(chowchow.variable2) // Prints "2"
提前谢谢你的光线!
答案 0 :(得分:1)
关于基本的Swift 4.0规范,指定和便利初始化程序之间的相同差异适用于任何其他情况。
此处使用的点数:
在你的例子中:
class ChowChow: Dog {
convenience init() {
self.init(variable1: "value1", variable2: 2)
}
}
你没有向ChowChow
子类引入任何指定的初始化器,因此,超类中的所有指定初始化器都是继承的(即init(variable1:variable2)
)。由于方便初始值设定项必须最终调用指定的初始值设定项,因此从便捷初始化程序中调用继承的self.init(variable1: "value1", variable2: 2)
,请注意自己。
在你的第二个例子中:
class ChowChow: Dog {
init() {
super.init(variable1: "value1", variable2: 2)
}
}
您将指定的初始值设定项init()
引入子类。默认情况下,指定的初始值设定项不会在子类中继承,除非满足某些条件(如第一个示例中所示)。因此,在这种特定情况下,子类ChowChow
只有一个指定的初始值设定项init()
而没有别的,因为指定的初始值设定项必须从超类调用指定的初始值设定项,你可以调用超类的super.init(variable1: "value1", variable2: 2)
,注意超级这里。 / p>
有关详细信息,请参阅:Initializer Inheritance and Overriding