我使用可变功能扩展了我的自定义协议。然后将其应用于相应类型的实例。但是实例仅在该行上更改。在下一行,它具有上一个值。为什么在实例上所做的更改不会持续?
如果我将questionHolder
的结果分配给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()
实例。由于值类型。但是我加上了可变的前缀...
如果有人向我解释原因及其机制,将非常感谢。
答案 0 :(得分:2)
代替从Workout
方法返回harderWorkout()
实例,而是将新的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
}
}
答案 1 :(得分:2)
这很简单-在您的workoutHarder()
中创建一个新的Workout
并将其返回,而不是对其进行突变。
如果您希望它突变,则需要执行以下操作:
extension Workout {
mutating func harderWorkout() -> Workout {
self.distance *= 2
self.time *=2
self.averageHR += 40
return self
}
}
您看到它现在从self
返回,并且如果您只想让它变异,也许该方法根本不需要返回?