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

Understanding init() when sub-classing in Swift

从已有初始化程序的 class 继承时如何添加自定义初始化程序?

我有一个 Vehicle class,它有一个接受参数 name 的初始化器。我想要做的是从这个 Vehicleclass 继承,为新的 class 创建另一个初始化器,但继续使用现有的初始化器。

基础Class(这里没问题):

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

新 Class(不起作用):

// 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)

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

Initializer Delegation for Class Types

To simplify the relationships between designated and convenience initializers, Swift applies the following three rules for delegation calls between initializers:

Rule 1 A designated initializer must call a designated initializer from its immediate superclass

...

来自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)
    }
}