为什么在实例上应用的变异方法不会保存更改?.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))
}
}

或者,您可以简单地更改同一实例的distancetimeaverageHR值,即

extension Workout {
mutating func harderWorkout() {
self.distance *= 2
self.time *= 2
self.averageHR += 40
}
}

它很漂亮,很简单 - 在你的workoutHarder()中,你创建一个新的Workout并返回它,而不是改变它。

如果你希望它发生变异,你将需要做到以下几点:

extension Workout {
mutating func harderWorkout() -> Workout {
self.distance *= 2
self.time *=2
self.averageHR += 40
return self
}
}

你看它现在从self返回,如果你只是想让它变异,也许该方法根本不需要返回?

最新更新