Что делает модификатор `mutating` в Swift и когда он применяется?

«Что делает модификатор `mutating` в Swift и когда он применяется?» — вопрос из категории Swift Core, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Ключевое слово 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 метод для константы

Важные правила:

  1. Применяется только к методам структур и перечислений.
  2. Может быть вызван только для переменных экземпляров (var), а не для констант (let).
  3. В классах не используется, так как они — reference-типы и их методы могут изменять свойства по умолчанию.