Где в Swift применяется Copy-on-write?

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

Ответ

Copy-on-write (CoW) — это оптимизация, применяемая к стандартным типам-значениям в Swift (Array, Dictionary, Set, String). Её цель — избежать избыточного копирования данных.

Как это работает: При присваивании или передаче значения создаётся новая ссылка на общее хранилище данных. Фактическое копирование (дублирование буфера в памяти) происходит только в момент первой модификации одной из копий.

Пример:

var array1 = [1, 2, 3]
var array2 = array1 // Нет реального копирования. Оба массива ссылаются на один буфер.

// Проверяем, что хранилище общее (в реальности это внутренняя деталь реализации)
print(array1[0]) // 1

array2.append(4) // Происходит CoW! Для array2 создаётся отдельная копия буфера.
print(array1) // [1, 2, 3] — array1 не изменился
print(array2) // [1, 2, 3, 4]

Почему это важно:

  • Эффективность: Передача больших массивов как параметров функции становится дешёвой операцией.
  • Семантика значений: Сохраняется ожидаемое поведение типа-значения — каждая переменная ведёт себя как независимая копия после модификации.

Где ещё используется?

  • В SwiftUI для оптимизации работы с property wrappers, такими как @State.
  • Вы можете реализовать CoW для своих собственных структур, используя классы для внутреннего хранения данных и проверку ссылок (isKnownUniquelyReferenced).