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

时间:2018-04-25 14:11:00

标签: swift inheritance subclass getter-setter

根据swift语言指南的继承章节,我试图在子类中编写compuputed 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",而实例的齿轮属性似乎有效。我已经搜索过但无法找到答案,这种情况会导致什么原因?

进一步的问题:

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"

在这种情况下,我不需要故意设置新的和财产的价值,两种情况之间的区别是什么?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

在你真实的例子中:

  • 广告系列currentSpeed存储的属性。这意味着您可以直接分配它,并且属性值会更改。

  • AutomaticCar currentSpeed实际上是不同的属性 - 计算属性。这意味着当您分配给它时,所有发生的事情都是set函数运行。结果不会更改存储的属性值,除非set函数中更改它们。

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

正如Hamish在评论中正确地说的那样,你的意思可能是这样说的:

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

在该公式中,AutomaticCar currentSpeed不是计算属性;它 Vehicle currentSpeed - 它与setter观察者一起是完全相同的存储属性。因此设置它会设置它,存储新值 - 现在我们运行setter观察者并在self.gear中进行更改。

请注意,子类中存储属性的覆盖必须是一个或另一个,可以是独立的计算属性,也可以是添加了setter观察者的原始存储属性。它本身不能是一个独立的存储属性。