根据 swift 语言指南的继承章节,我尝试在子类中编写计算的 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 属性的值,这两种情况有什么区别?
在你的真实例子中:
车辆currentSpeed
是储存的财产。这意味着您可以直接分配给它并且属性值会发生变化。
AutomaticCarcurrentSpeed
实际上是一个不同的属性——一个计算属性。这意味着当您分配给它时,所发生的一切就是该set
函数运行。结果不会更改存储的属性值,除非您在set
函数中更改它们。
好吧,在您的 AutomaticCarcurrentSpeed
set
函数中,您没有将新值存储在存储属性 Vehicle's 中currentSpeed
。因此它没有改变,因为没有发生任何改变它的事情。
正如 Hamish 在评论中正确地说的那样,您的意思可能是这样的:
class AutomaticCar: Car {
override var currentSpeed: Double {
didSet {
self.gear = Int(self.currentSpeed/10) + 1
}
}
}
在该公式中,AutomaticCarcurrentSpeed
不是计算属性;它是Vehicle currentSpeed
- 它是完全相同的存储属性,以及一个 setter 观察者。所以设置它会设置它,存储新值——加上现在我们运行 setter 观察器并进行self.gear
你所追求的改变。
请注意,子类中存储属性的覆盖必须是其中之一,要么是独立的计算属性,要么是添加了 setter 观察者的原始存储属性。它本身不能是一个独立的存储属性。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句