gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 09:53:46 24 4
gpt4 key购买 nike

从已有初始化器的类继承时如何添加自定义初始化器?

我有一个 Vehicle 类,它有一个接受参数 name 的初始化器。我想要做的是从这个 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)

最佳答案

子类中的任何指定构造器都必须调用其直接父类(super class)中的指定构造器:

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 参数(提供给子类初始化器)作为父类(super class)初始化器的参数调用父类(super class)的指定初始化器。

class Car: Vehicle {
var engine: Double

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

关于swift - 在 Swift 中进行子类化时理解 init(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41466580/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com