Какие типы в Swift используют механизм Copy-on-Write (COW)?

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

Ответ

Copy-on-Write (COW) — это оптимизация, при которой реальное копирование данных откладывается до момента их модификации. В Swift COW применяется для:

  1. Стандартных коллекций (Array, Dictionary, Set) и типа String. Они реализованы как структуры (value types), но хранят данные в буфере с ссылочной семантикой.
  2. Других структур из Swift Standard Library, которые содержат ссылочные данные.
  3. Пользовательских типов, где COW можно реализовать вручную, используя класс-хранилище и функцию isKnownUniquelyReferenced.

Пример работы COW:

var array1 = [1, 2, 3]
var array2 = array1 // На этом этапе оба массива ссылаются на один буфер.
print(array1[0]) // 1
// Пока данные только читаются, копирования не происходит.

array2.append(4) // При модификации `array2` создается его уникальная копия.
// Теперь array1 = [1, 2, 3], а array2 = [1, 2, 3, 4]

Где COW не используется:

  • Простые value-типы (Int, Double, Bool, struct без ссылочных свойств) — копируются сразу.
  • Классы (reference types) — всегда передаются по ссылке.