在Swift中进行子类化时了解init()

时间:2017-01-04 14:44:40

标签: swift inheritance subclass init

如何从已经具有初始化程序的类继承时添加自定义初始值设定项?

我所拥有的是Vehicle类,其中有一个使用参数name的itializer。我想要做的是继承这个Vehicle类,为新类创建另一个初始化器,但继续使用现有的初始化器。

基类(这里没问题):

class Vehicle{
    var make:String
    init(make:String){
     self.make = make
    }
}

新课程(没有工作):

// Not sure how to structure this class     
class Car:Vehicle {
    var engine:Double

    override init(){
        super.init()
    }

    init(engine:Double){
        self.engine = engine
    }
}
这就是我希望能够做到的...重新使用现有的初始化程序和新的初始化程序。
let cobalt = Car(make:"Chevy" engine: 2.5)

1 个答案:

答案 0 :(得分:5)

子类中的任何指定初始值设定项必须从其直接超类调用指定的初始值设定项:

  

类类型的初始化程序委派

     

简化指定与便利之间的关系   初始化程序,Swift应用以下三个委托规则   初始化程序之间的调用:

     

规则1指定的初始化程序必须调用指定的初始化程序   来自其直接的超类

     

...

来自Swift Language Guide - Initialization

因此,您可以构造指定的Car初始值设定项,以获取两个参数makeengine,并使用后者启动成员属性engine子类,然后使用提供的make参数(提供给子类初始化程序)作为超类初始化程序的参数调用超类的指定初始值设定项。

class Car: Vehicle {
    var engine: Double

    init(make: String, engine:Double){
        self.engine = engine
        super.init(make: make)
    }
}