为什么应用于实例的变异方法无法保存更改?迅速

时间:2019-09-09 06:43:00

标签: swift methods extension-methods mutating-function

我使用可变功能扩展了我的自定义协议。然后将其应用于相应类型的实例。但是实例仅在该行上更改。在下一行,它具有上一个值。为什么在实例上所做的更改不会持续?

如果我将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()实例。由于值类型。但是我加上了可变的前缀... 如果有人向我解释原因及其机制,将非常感谢。

2 个答案:

答案 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))
    }
}

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

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返回,并且如果您只想让它变异,也许该方法根本不需要返回?