-1

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

如果我将结果分配mutatingvar/ 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实例。也许是因为值类型。但是我放了可变前缀...... 如果有人向我解释原因及其机制,将非常感激。

4

2 回答 2

3

不是Workout从方法返回实例,而是harderWorkout()将新Workout实例分配给self,即

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

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

extension Workout {
    mutating func harderWorkout() {
        self.distance *= 2
        self.time *= 2
        self.averageHR += 40
    }
}
于 2019-09-09T06:45:46.223 回答
2

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

如果您希望它发生变异,则需要执行以下操作:

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

您会看到它现在从self中返回,如果您只是希望它发生变异,也许该方法根本不需要返回?

于 2019-09-09T06:48:38.557 回答