Что происходит при вызове mutating метода у структуры в Swift: создается копия или изменяется текущий экземпляр?

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

Ответ

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

Как это работает? Компилятор неявно передает экземпляр структуры в mutating метод как inout параметр. Это означает, что функция работает с оригинальной переменной, переданной по ссылке, а не с ее копией.

Пример и объяснение:

struct Point {
    var x: Int, y: Int

    // Этот метод модифицирует self
    mutating func moveBy(x deltaX: Int, y deltaY: Int) {
        x += deltaX // Прямое изменение свойства текущего экземпляра
        y += deltaY
    }
}

var myPoint = Point(x: 10, y: 20)
myPoint.moveBy(x: 5, y: -5) // Вызов mutating метода
print(myPoint) // Point(x: 15, y: 15) - изменился исходный `myPoint`

Важные нюансы:

  1. mutating методы можно вызывать только для переменных (var), но не для констант (let).
  2. Для классов (ссылочных типов) mutating не требуется, так как методы всегда могут изменить свойства объекта, на который ссылается переменная.
  3. Если внутри mutating метода присвоить новый экземпляр свойству self, это полностью заменит текущий экземпляр: self = Point(x: 0, y: 0).