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

如何在swift中更改子类中的属性值?,swift,inheritance,subclass,getter-setter,Swift,Inheritance,Subclass,Getter Setter,根据swift language guide的继承章节,我尝试在子类中编写Computed peoperty。当我将newValue设置为类实例的属性时,setter似乎可以工作,而属性值没有转换为newValue class Vehicle { var currentSpeed = 1.0 var description: String { return "The current speed is \(currentSpeed) miles per hour"

根据swift language guide的继承章节,我尝试在子类中编写Computed peoperty。当我将newValue设置为类实例的属性时,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,而实例的gear属性似乎有效。我已经搜索过了,但找不到答案,是什么原则导致了这种情况

进一步问题:

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的值。

在您的实际示例中:

车辆当前速度是一个存储属性。这意味着您可以直接指定给它,并且属性值会更改

AutomaticCar currentSpeed实际上是一个不同的属性—计算属性。这意味着当您分配给它时,所发生的一切就是set函数运行。存储的属性值不会因此而更改,除非您在set函数中更改它们

在AutomaticCar的currentSpeed设置函数中,您没有将新值存储在存储的属性Vehicle's currentSpeed中。因此它没有改变,因为没有任何事情会改变它

正如哈米什在评论中正确地说的,你的意思可能是:

class AutomaticCar: Car {
    override var currentSpeed: Double {
        didSet {
            self.gear = Int(self.currentSpeed/10) + 1
        }
    }
}
在该公式中,AutomaticCar currentSpeed不是计算属性;它是Vehicle currentSpeed(车辆当前速度)-它与setter observer(设定者观察者)是完全相同的存储属性。所以设置它会设置它,存储新的值-现在我们运行setter观察器,并在self.gear中进行更改


请注意,子类中存储属性的重写必须是一个或另一个,要么是独立的计算属性,要么是添加了setter观察器的原始存储属性。它本身不能是一个独立的存储属性。

或者,您可以重写didSet属性observer–override var currentSpeed:Double{didSet{gear=IntcurrentSpeed/10+1}}.Thanx以获取帮助。我想知道,在另一种情况下,为什么不需要在setter中设置a.sum的值?类和子类之间有什么区别吗?@astost你把自己搞糊涂了。它与类与子类无关。它与存储属性和计算属性有关。-正如Hamish正确地说的,如果您的currentSpeed override是一个setter观察器而不是一个computed属性,那么这将更加简单和清晰。@第一种情况下的automaticCar.currentSpeed和第二种情况下的a.sum都是computed属性,但有必要在setter中设置currentSpeed的值,虽然似乎没有必要在setter中设置sum的值。我对这两种情况在这方面的区别感到困惑。@astost你在“不需要”这个词上含糊其辞。没有必要,因为在您的类示例中,computed属性依赖于您在setter中操作的两个存储属性。然后,getter返回正确的答案。当然,AutomaticCar也是如此——它取决于一个存储的属性,如果你想在它的getter中得到正确的答案,你必须对它进行操作。换句话说,在A级,你的能手和二传手一起,但在自动驾驶中,你的能手和二传手不一起。