为什么应用于实例的变异方法不保存更改? swift
why mutating method applied on instance doesn't save changes? swift
我用可变函数扩展了我的自定义协议。然后应用到相应类型的实例上。但是实例只在该行发生变化。在下一行,它具有先前的值。为什么对实例所做的更改不会持续存在?
如果我将mutating
的结果赋值给var
/let
。然后结果保存。或者,如果我在 print()
语句中应用 harderWorkout()
,它会打印更改的值。
struct Workout {
var distance: Double
var time: Double
var averageHR: Int
}
extension Workout: CustomStringConvertible {
var description: String {
return "Workout(distance: \(distance), time: \(time), averageHR: \(averageHR)"
}
}
extension Workout {
mutating func harderWorkout() -> Workout {
return Workout(distance: (self.distance * 2), time: (self.time * 2), averageHR: (self.averageHR + 40))
}
}
var workout = Workout(distance: 500, time: 50, averageHR: 100)
print(workout) //Workout(distance: 500.0, time: 50.0, averageHR: 100, Speed: 10.0
workout.harderWorkout()
print(workout) //Workout(distance: 500.0, time: 50.0, averageHR: 100, Speed: 10.0
在上次打印中,我希望看到 Workout(distance: 1000.0, time: 100.0, averageHR: 140
,但 我不清楚为什么 harderWorkout()
方法不会更改 workout
实例。 可能是因为值类型。但我把可变前缀...
如果有人能给我解释一下原因和机制,将不胜感激。
不是从 harderWorkout()
方法返回 Workout
实例,而是将新的 Workout
实例分配给 self
,即
extension Workout {
mutating func harderWorkout() {
self = Workout(distance: (self.distance * 2), time: (self.time * 2), averageHR: (self.averageHR + 40))
}
}
或者,您可以简单地更改同一实例的 distance
、time
和 averageHR
值,即
extension Workout {
mutating func harderWorkout() {
self.distance *= 2
self.time *= 2
self.averageHR += 40
}
}
它非常简单 - 在您的 workoutHarder()
中,您创建一个新的 Workout
和 return,而不是改变它。
如果您希望它发生变异,则需要执行以下操作:
extension Workout {
mutating func harderWorkout() -> Workout {
self.distance *= 2
self.time *=2
self.averageHR += 40
return self
}
}
你看到它现在 returns 来自 self
,如果你只是想让它变异,也许这个方法根本不需要 return?
我用可变函数扩展了我的自定义协议。然后应用到相应类型的实例上。但是实例只在该行发生变化。在下一行,它具有先前的值。为什么对实例所做的更改不会持续存在?
如果我将mutating
的结果赋值给var
/let
。然后结果保存。或者,如果我在 print()
语句中应用 harderWorkout()
,它会打印更改的值。
struct Workout {
var distance: Double
var time: Double
var averageHR: Int
}
extension Workout: CustomStringConvertible {
var description: String {
return "Workout(distance: \(distance), time: \(time), averageHR: \(averageHR)"
}
}
extension Workout {
mutating func harderWorkout() -> Workout {
return Workout(distance: (self.distance * 2), time: (self.time * 2), averageHR: (self.averageHR + 40))
}
}
var workout = Workout(distance: 500, time: 50, averageHR: 100)
print(workout) //Workout(distance: 500.0, time: 50.0, averageHR: 100, Speed: 10.0
workout.harderWorkout()
print(workout) //Workout(distance: 500.0, time: 50.0, averageHR: 100, Speed: 10.0
在上次打印中,我希望看到 Workout(distance: 1000.0, time: 100.0, averageHR: 140
,但 我不清楚为什么 harderWorkout()
方法不会更改 workout
实例。 可能是因为值类型。但我把可变前缀...
如果有人能给我解释一下原因和机制,将不胜感激。
不是从 harderWorkout()
方法返回 Workout
实例,而是将新的 Workout
实例分配给 self
,即
extension Workout {
mutating func harderWorkout() {
self = Workout(distance: (self.distance * 2), time: (self.time * 2), averageHR: (self.averageHR + 40))
}
}
或者,您可以简单地更改同一实例的 distance
、time
和 averageHR
值,即
extension Workout {
mutating func harderWorkout() {
self.distance *= 2
self.time *= 2
self.averageHR += 40
}
}
它非常简单 - 在您的 workoutHarder()
中,您创建一个新的 Workout
和 return,而不是改变它。
如果您希望它发生变异,则需要执行以下操作:
extension Workout {
mutating func harderWorkout() -> Workout {
self.distance *= 2
self.time *=2
self.averageHR += 40
return self
}
}
你看到它现在 returns 来自 self
,如果你只是想让它变异,也许这个方法根本不需要 return?