Являются ли value-типы (Value Types) в Swift изменяемыми по умолчанию?

«Являются ли value-типы (Value Types) в Swift изменяемыми по умолчанию?» — вопрос из категории Swift Core, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, value-типы (структуры, перечисления, кортежи) по умолчанию неизменяемы (immutable). Их изменяемость определяется ключевым словом, используемым при объявлении экземпляра: var (изменяемый) или let (неизменяемый).

Ключевое правило:

  • Экземпляр, объявленный через let, нельзя изменить, даже если его свойства объявлены как var.
  • Экземпляр, объявленный через var, можно изменить.

Пример, демонстрирующий семантику копирования:

struct Point {
    var x: Int
    var y: Int
}

var pointA = Point(x: 1, y: 2) // Изменяемый экземпляр
let pointB = pointA             // Создается независимая копия, экземпляр pointB неизменяем

pointA.x = 10 // Разрешено, так как pointA объявлен с 'var'
// pointB.x = 20 // Ошибка компиляции: pointB объявлен с 'let'

print(pointA) // Point(x: 10, y: 2)
print(pointB) // Point(x: 1, y: 2) - копия не изменилась

Почему это важно? Такое поведение обеспечивает предсказуемость и безопасность, предотвращая случайные изменения данных, переданных в разные части программы.