我正在遵循swDC初始化程序中WWDC中建议的代码。但是我看到错误"覆盖声明需要覆盖关键字"。 我错过了什么?
class Car{
var paintColour: Colour
init(colour: Colour){
self.paintColour = colour;
}
}
class Colour{
}
class RaceCar: Car {
var hasTurbo: Bool
init(colour: Colour, turbo: Bool){
self.hasTurbo = turbo;
super.init(colour: colour);
}
convenience init(colour: Colour) {
self.init(colour: colour, turbo: true);
}
}
但是在上面的便捷初始化程序中,我看到编译器错误"覆盖声明需要覆盖关键字"。
class FormulaOne: RaceCar{
init(color: Colour, hasTurbo: Bool){
super.init(colour: color, turbo: false);
}
}
当代码与WWDC视频中显示的完全相同时,出现此错误的原因是什么?
答案 0 :(得分:1)
从Car类继承时,继承了他的方法,属性和初始值。
这个init
init(colour: Colour)
仍然在超类Car中实现,因此如果要更改或添加更多功能,必须编写覆盖。
在FormulaOne类中,init函数没有相同的声明。
尝试从
更改 init(color: Colour, turbo: Bool)
到
init(colour: Colour, turbo: Bool)
编译器会告诉您添加convenience
关键字,因为在您的实现中,您调用self.init
并且指定的init必须调用super.init
而不是同一类{{1}中的另一个init }}
Swift中有两种启动器:指定和便利。 指定的init是主要的init。 便利初始化是辅助初始化。
关于初始化程序的Swift 3规则:
答案 1 :(得分:0)
RaceCar
正在覆盖初始化程序
init(colour: Colour)
由其超类Car
提供。
您需要显式注释该方法,正如错误消息告诉您的那样。
convenience override init(colour: Colour) { ... }