Как mutating метод изменяет экземпляр структуры в Swift?

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

Ответ

Ключевое слово mutating позволяет методу модифицировать свойства value-типа (структуры или перечисления). При вызове такого метода для var экземпляра, создается новая копия структуры с измененными значениями, которая затем заменяет исходный экземпляр.

Пример:

struct Point {
    var x: Int
    var y: Int

    // mutating метод изменяет свойства
    mutating func moveBy(x deltaX: Int, y deltaY: Int) {
        x += deltaX
        y += deltaY
    }
}

var point = Point(x: 0, y: 0)
point.moveBy(x: 5, y: 5) // point теперь Point(x: 5, y: 5)

Ключевые аспекты:

  • Только для var: Вызов mutating метода для экземпляра, объявленного через let, вызовет ошибку компиляции.
  • Семантика value-типа: Изменение происходит через подмену всего экземпляра, что соответствует поведению value-типов.
  • Оптимизация (Copy-on-Write): Для сложных структур (например, Array) Swift использует механизм Copy-on-Write, чтобы избежать излишнего копирования, пока данные не будут реально изменены.