Какие типы значений (Value Types) существуют в Swift?

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

Ответ

В Swift типы значений (Value Types) — это типы, экземпляры которых копируются при присваивании новой переменной или константе или при передаче в качестве аргумента функции. Копирование обеспечивает независимость экземпляров.

Основные типы значений:

  1. Структуры (struct) — самый распространенный тип для моделирования данных.
  2. Перечисления (enum) — для представления группы связанных значений.
  3. Кортежи (tuple) — для временной группировки нескольких значений.
  4. Все базовые (примитивные) типы: Int, Double, Bool, String, Array, Dictionary, Set.
    • Важно: Array, Dictionary, Set реализованы как структуры, поэтому они также являются типами значений с семантикой copy-on-write для оптимизации производительности.

Ключевая характеристика — семантика копирования:

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

var pointA = Coordinates(x: 5, y: 10)
var pointB = pointA // Происходит КОПИРОВАНИЕ значений

pointB.x = 20 // Изменяется только копия

print(pointA.x) // 5 (оригинал не изменился)
print(pointB.x) // 20

Почему это важно (преимущества):

  • Потокобезопасность: Поскольку каждый экземпляр изолирован, несколько потоков могут работать с разными копиями данных без риска гонок.
  • Предсказуемость: Поведение кода легче отслеживать — передача данных в функцию не может неожиданно изменить исходную переменную.
  • Производительность: Небольшие типы значений обычно хранятся в стеке, что обеспечивает быстрый доступ.

Особенности работы:

  • Для изменения свойств внутри метода структуры необходимо помечать метод как mutating.
  • Типы значений по умолчанию не поддерживают наследование.
  • Они автоматически получают поэлементный инициализатор (memberwise initializer).
Сравнение с ссылочными типами (class): Критерий Тип значения (struct) Ссылочный тип (class)
Копирование Создается новая копия данных. Копируется только ссылка (указатель) на одни и те же данные.
Хранение Чаще в стеке (быстро). В куче (heap).
Наследование Нет. Есть.
Идентичность Сравнивается по значению (==). Сравнивается по ссылке (===).

Рекомендация Apple: Используйте типы значений по умолчанию для моделирования данных. Переходите на класс только когда необходима специфическая семантика ссылок (например, общее состояние, идентичность объекта).