在Swift中覆盖变量

3

我正在尝试通过不同的教程学习Swift语言,但是我遇到了一个问题。下面是我的代码:

Class Vehicle {
    var seats = 5
    var maxSpeed = 100
}

class Bike : Vehicle{
    override var seats = 3
}

但是我不断地收到有关尝试覆盖var seats的错误,指出无法使用存储属性'seats'进行重写

我做错了什么?我以为我可以覆盖继承的变量?

1个回答

4

您实际上不需要覆盖该属性,只需使用不同的值进行初始化即可,在初始化器中可以完成:

class Vehicle {
    var seats = 5
    var maxSpeed = 100
}

class Bike : Vehicle{
    override init() {
        super.init()
        self.seats = 3
    }
}

关于覆盖属性,lang reference 指出:
您可以覆盖继承的实例或类属性,以提供自己的自定义getter和setter,或添加属性观察器,使覆盖属性能够观察底层属性值的更改。

嗯,我知道我可以用不同的值进行初始化,但在Swift文档([链接] https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Inheritance.html#//apple_ref/doc/uid/TP40014097-CH17-ID193)中,一个类定义了一个变量`var currentSpeed = 0.0,但在后来的子类(子类automaticCar : Car)中,var currentSpeed被覆盖了,用了override var currentSpeed: Double {....`。为什么这样是允许的,而我的不行呢? - tobyapp
在这种情况下,您正在提供自定义getter - 您不能使用另一个存储的属性覆盖存储的属性以设置不同的初始值。 - Antonio
哦,好的,所以如果我想要覆盖超类中的座位变量,我必须在子类中定义一个自定义getter来获取该变量? - tobyapp
正确 - 实际上你正在将它转换为一个计算属性。 - Antonio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接