我正在关注本教程: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方法,你需要初始化所有存储的属性(来自超类和子类)吗?
答案 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)
}
您传递给超级初始化程序的brand
和model
是什么?他们在哪里定义?如果你的意思是self.brand
和self.model
,那么你就不能使用它们。他们还没有被初始化!
在不知道你真正希望你的钢琴初始化设备是什么的情况下,我无法准确回答问题,但解决此问题的一种方法是添加brand
和{{1}参数:
model
现在init(hasPedals: Bool, brand: String, model: String) {
self.hasPedals = hasPedals
super.init(brand: brand, model: model)
}
和brand
参考参数。