如何更改 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 观察员。它本身不能是独立存储的 属性.
根据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 观察员。它本身不能是独立存储的 属性.