В чем разница между Value Type и Reference Type в Swift?

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

Ответ

Value Type (типы-значения) и Reference Type (ссылочные типы) — это фундаментальные категории типов в Swift, определяющие, как данные хранятся и копируются.

Аспект Value Type (Структура, Enum, Кортеж) Reference Type (Класс, Замыкание)
Хранение Копия данных хранится непосредственно в переменной (часто в стеке). Данные хранятся в куче, переменная содержит ссылку на них.
Копирование При присваивании (=) или передаче в функцию создается новая, независимая копия данных. Копируется только ссылка на одни и те же данные в памяти.
Изменяемость По умолчанию иммутабельны. Для мутации методов используется mutating. Мутабельны по умолчанию (если свойства не let).
Потокобезопасность Безопасны, так как каждый поток работает со своей копией. Требует синхронизации, так как состояние общее.
Наследование Не поддерживают наследование. Поддерживают протоколы. Поддерживают наследование (один родительский класс).
Управление памятью Автоматическое (стек). Подсчет ссылок (ARC).

Практический пример:

// VALUE TYPE (Struct)
struct Point {
    var x, y: Int
}
var pointA = Point(x: 1, y: 2)
var pointB = pointA // Создается ПОЛНАЯ КОПИЯ
pointB.x = 3
print(pointA.x) // 1 (pointA не изменился)

// REFERENCE TYPE (Class)
class Person {
    var name: String
    init(name: String) { self.name = name }
}
var personA = Person(name: "Alice")
var personB = personA // Копируется ССЫЛКА на тот же объект
personB.name = "Bob"
print(personA.name) // "Bob" (personA изменился, так как это тот же объект)

Когда что использовать:

  • Value types — для простых данных, моделей, когда нужна независимость копий и потокобезопасность. Это подход по умолчанию в Swift.
  • Reference types — когда необходимо разделяемое, мутабельное состояние или наследование (например, для UI-компонентов UIViewController).