我用可变函数扩展了我的自定义协议。然后将其应用到相应类型的实例上。但是实例仅在该行上更改。在下一行,它具有先前的值。为什么对实例所做的更改不会持续存在?
如果我将结果分配mutating
给var
/ let
。然后结果保存。或者,如果我harderWorkout()
在print()
声明中应用它会打印更改的值。
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
实例。也许是因为值类型。但是我放了可变前缀......
如果有人向我解释原因及其机制,将非常感激。