swift方便初始化程序错误

时间:2014-09-19 13:04:12

标签: swift initializer

我正在遵循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视频中显示的完全相同时,出现此错误的原因是什么?

2 个答案:

答案 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. 指定的init必须从其超类
  2. 调用指定的init
  3. 便利init必须从同一个类调用另一个init
  4. 方便init最终必须调用指定的init。
  5. Swift 3规则说明:

    rules illustrated

答案 1 :(得分:0)

RaceCar正在覆盖初始化程序

init(colour: Colour)

由其超类Car提供。

您需要显式注释该方法,正如错误消息告诉您的那样。

convenience override init(colour: Colour) { ... }