Для чего в Swift используется ключевое слово `mutating`?

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

Ответ

Ключевое слово mutating используется для обозначения методов структур (struct) и перечислений (enum), которые изменяют значения их свойств (self) или self целиком.

Зачем это нужно? По умолчанию методы value-типов (структур и перечислений) не могут изменять свои свойства, потому что внутри метода self является неизменяемым (let). Модификатор mutating явно дает на это разрешение.

Пример:

struct Point {
    var x = 0.0, y = 0.0

    // Этот метод изменяет свойства структуры
    mutating func moveBy(x deltaX: Double, y deltaY: Double) {
        x += deltaX
        y += deltaY
        // Эквивалентно: self = Point(x: self.x + deltaX, y: self.y + deltaY)
    }
}

var myPoint = Point(x: 1.0, y: 1.0)
myPoint.moveBy(x: 2.0, y: 3.0) // Работает, так как myPoint объявлен через 'var'
print(myPoint) // Point(x: 3.0, y: 4.0)

let constantPoint = Point(x: 1.0, y: 1.0)
// constantPoint.moveBy(x: 2.0, y: 3.0) // Ошибка компиляции: нельзя вызвать mutating метод для константы

Важные детали:

  1. mutating не используется с классами (class), так как они являются reference-типами и их методы могут изменять свойства по умолчанию.
  2. Вызов mutating метода для экземпляра, объявленного как константа (let), вызовет ошибку компиляции.
  3. Внутри mutating метода вы можете присвоить полностью новый экземпляр свойству self.