Как изменить свойство структуры в Swift?

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

Ответ

Свойства структуры можно изменять, но с важным ограничением: методы, изменяющие свойства, должны быть помечены как mutating.

Почему это необходимо? Структуры в Swift — value-типы. При вызове метода создается копия структуры, и без mutating изменения не сохранятся.

Пример корректного изменения:

struct Point {
    var x: Int
    var y: Int

    // Метод ДОЛЖЕН быть mutating
    mutating func moveBy(x deltaX: Int, y deltaY: Int) {
        x += deltaX
        y += deltaY
    }
}

// Только переменная (var), не константа (let)
var point = Point(x: 0, y: 0)
point.moveBy(x: 5, y: 5) // Теперь point.x = 5, point.y = 5

Что нельзя делать:

struct Point {
    var x: Int

    // Ошибка компиляции: метод не mutating
    func increment() {
        x += 1 // ❌ Cannot assign to property: 'self' is immutable
    }
}

let point = Point(x: 0)
point.x = 5 // ❌ Cannot assign to property: 'point' is a 'let' constant

Практические рекомендации:

  1. Используйте mutating для методов, изменяющих любые свойства
  2. Структура должна быть объявлена как var, а не let
  3. Для вычисляемых свойств используйте mutating get если свойство изменяет self
  4. Рассмотрите создание новой структуры вместо мутации для иммутабельных данных