Ответ
Copy-on-Write (COW) — это оптимизация, при которой реальное копирование данных откладывается до момента их модификации. В Swift COW применяется для:
- Стандартных коллекций (
Array,Dictionary,Set) и типаString. Они реализованы как структуры (value types), но хранят данные в буфере с ссылочной семантикой. - Других структур из Swift Standard Library, которые содержат ссылочные данные.
- Пользовательских типов, где 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) — всегда передаются по ссылке.