如何更改 swift 子类中的 属性 值?

How can I change the property value in subclass within swift?

根据swift 语言指南的继承章节,我尝试在子class 中编写计算属性。当我将 newValue 设置为 class 实例的 属性 时,setter 似乎有效,而 属性 值没有转换为 newValue。

class Vehicle {
    var currentSpeed = 1.0
    var description: String {
        return "The current speed is \(currentSpeed) miles per hour"
    }
    func makeNoise() {
    }
}
class Car: Vehicle {
    var gear = 0
    override var description: String {
        return super.description + " in gear \(gear)"
    }
}
class AutomaticCar: Car {
    override var currentSpeed: Double {
        get {
            return super.currentSpeed
        }
        set {
            gear = Int(newValue/10) + 1
        }
    }
}

let automaticCar = AutomaticCar()
automaticCar.currentSpeed = 12.0
print(automaticCar.currentSpeed)//It prints "1.0"
print(automaticCar.description)//It prints "The current speed is 1.0 miles per hour in gear 2"

automaticCar.currentSpeed的属性值仍然是“1.0”而不是“12.0”,而实例的齿轮属性似乎有效。我已经搜索过了,没有找到答案,是什么原理导致的这种情况?

进一步的问题:

class A {
    var test1 = 1
    var test2 = 2
    var sum: Int {
        get {
            return test1 + test2
        }
        set {
            test1 = newValue - test2
        }
    }
}
var a = A()
print(a.sum)
a.sum = 4
print(a.sum)//It ptints "4"
print(a.test1)//It prints "2"

在这种情况下,我不需要刻意设置new sum的值属性,这两种情况有什么区别?

class AutomaticCar: Car {
    override var currentSpeed: Double {
        get {
            return super.currentSpeed
        }
        set {
            super.currentSpeed = newValue
            gear = Int(newValue/10) + 1
        }
    }
}

您刚刚忘记在重写 setter 中设置 currentSpeed 的值。

在您的真实示例中:

  • 车辆 currentSpeed 存储的 属性。这意味着您可以直接分配给它并且 属性 值会更改。

  • AutomaticCar currentSpeed 实际上是 different 属性 — computed 属性。这意味着当你分配给它时,所发生的只是 set 函数 运行s。没有存储的 属性 值因此而改变,除非 改变它们,就在这里,在 set 函数中。

好吧,在您的 AutomaticCar 的 currentSpeed set 函数中,您没有将新值存储在已存储的 属性、Vehicle 的 currentSpeed 中。因此它没有改变,因为没有任何事情会改变它。

正如 Hamish 在评论中所说的那样,您 的意思 可能是这样说的:

class AutomaticCar: Car {
    override var currentSpeed: Double {
        didSet {
            self.gear = Int(self.currentSpeed/10) + 1
        }
    }
}

在该公式中,AutomaticCar currentSpeed 不是计算的 属性;它 车辆 currentSpeed — 它与存储的 属性 完全相同,还有一个 setter 观察者。所以设置它设置它,存储新值——再加上现在我们 运行 setter 观察者并在 self.gear 中做出你想要的改变。

请注意,子类中存储的 属性 的覆盖必须是其中之一,要么是独立计算的 属性,要么是原始存储的 属性 添加了setter 观察员。它本身不能是独立存储的 属性.