В чем разница между ссылочными типами и типами значений в Swift?

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

Ответ

Типы значений (структуры, перечисления, кортежи) и ссылочные типы (классы) фундаментально различаются по семантике копирования и хранения.

Типы значений (Value Types)

  • Копируются при присваивании или передаче в функцию/метод.
  • Хранятся в стеке (как правило), что обеспечивает высокую скорость работы.
  • Изменение копии не затрагивает оригинал.
  • Примеры: struct, enum, кортежи.
struct Point {
    var x, y: Int
}
var pointA = Point(x: 0, y: 0)
var pointB = pointA // Создается независимая копия
pointB.x = 5
print(pointA.x) // 0 (оригинал не изменился)

Ссылочные типы (Reference Types)

  • Передаются по ссылке. При присваивании копируется только ссылка на один и тот же экземпляр в памяти.
  • Хранятся в куче (heap).
  • Изменение через одну ссылку видно через все другие.
  • Поддерживают наследование.
  • Пример: class.
class Person {
    var name: String
    init(name: String) { self.name = name }
}
let personA = Person(name: "Alice")
let personB = personA // Обе ссылки указывают на один объект
personB.name = "Bob"
print(personA.name) // "Bob" (объект общий)

Ключевые отличия

Критерий Тип значения Ссылочный тип
Семантика Копирование Передача по ссылке
Хранение Стек (обычно) Куча
Наследование Не поддерживается Поддерживается
Потокобезопасность Проще (независимые копии) Сложнее (общий ресурс)

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