Ответ
Ключевое слово mutating используется для пометки методов структур (struct) и перечислений (enum), которые изменяют свои собственные свойства или присваивают новый экземпляр self.
Зачем это нужно? Структуры и перечисления — это value-типы. По умолчанию их методы не могут изменять свойства, так как они работают с неизменяемой копией (self). Модификатор mutating явно указывает, что метод будет изменять экземпляр.
Пример использования:
struct Counter {
private var value = 0
// Метод изменяет свойство `value`, поэтому требуется `mutating`
mutating func increment() {
value += 1
}
// Можно полностью заменить `self`
mutating func reset(to newValue: Int) {
self = Counter(value: newValue)
}
}
var myCounter = Counter()
myCounter.increment() // Работает, так как `myCounter` — переменная (var)
// let constantCounter = Counter()
// constantCounter.increment() // Ошибка компиляции: нельзя вызвать mutating метод для константы
Важные правила:
- Применяется только к методам структур и перечислений.
- Может быть вызван только для переменных экземпляров (
var), а не для констант (let). - В классах не используется, так как они — reference-типы и их методы могут изменять свойства по умолчанию.