在super.init初始化self super.init之前在属性访问'model'中使用'self'(品牌:品牌,型号:model)

时间:2017-10-01 09:22:09

标签: swift

我正在关注本教程:https://www.raywenderlich.com/160728/object-oriented-programming-swift

...并尝试对代码进行一些个人调整,看看我是否能够自己理解一些核心概念。

我最终得到以下代码:

class Instrument {

var brand: String
var model: String

init(brand: String, model: String) {

    self.brand = brand
    self.model = model

}

func tune() {

    print("\(model) tuned !")
}

func play() {

    print("\(model) plays an improvised melody")

}

func perform() {

    print(tune())
    print(play())
}

}

这个子类:

class Piano: Instrument {

var hasPedals: Bool

init(hasPedals: Bool ) {

    self.hasPedals = hasPedals
    super.init(brand: brand, model: model)

}

}

此时,我有以下错误消息:

  

游乐场执行失败:

     

错误:面向对象的programming.playground:28:41:错误:使用   在super.init初始化self之前,'self'在属性访问'model'中           super.init(品牌:品牌,型号:型号)                                           ^

     

错误:面向对象的programming.playground:28:27:错误:使用   在super.init初始化自我之前,'自我'在物业访问'品牌'           super.init(品牌:品牌,型号:型号)

我觉得这是一个非常明显的错误,但我无法弄清楚如何解决它。

编辑:非常感谢你们的超级干净答案。现在对我来说很有感觉!

如果我理解它是正确的,即使你在子类中使用自定义init方法,你需要初始化所有存储的属性(来自超类和子类)吗?

2 个答案:

答案 0 :(得分:2)

您正在调用超类init方法来初始化子类的一部分。但是,在初始化之前,您传递了一个未初始化的变量。只需将这些变量添加到Piano

的参数中
init(hasPedals: Bool, brand: String, model: String)

答案 1 :(得分:1)

仔细看看:

init(hasPedals: Bool ) {

    self.hasPedals = hasPedals
    super.init(brand: brand, model: model)

}

您传递给超级初始化程序的brandmodel是什么?他们在哪里定义?如果你的意思是self.brandself.model,那么你就不能使用它们。他们还没有被初始化!

在不知道你真正希望你的钢琴初始化设备是什么的情况下,我无法准确回答问题,但解决此问题的一种方法是添加brand和{{1}参数:

model

现在init(hasPedals: Bool, brand: String, model: String) { self.hasPedals = hasPedals super.init(brand: brand, model: model) } brand参考参数。