Ответ
Copy-on-Write (CoW) оптимизирует работу со value-типами, откладывая копирование данных до момента их реальной модификации. Реализуется через комбинацию struct и внутреннего ссылочного типа (class).
Базовая реализация:
// 1. Класс-хранилище (ссылочный тип)
final class Ref<T> {
var value: T
init(_ value: T) { self.value = value }
}
// 2. Публичная структура (value-тип) с CoW
struct CoWBox<T> {
private var ref: Ref<T>
init(_ value: T) {
ref = Ref(value) // Создаем единственную ссылку
}
var value: T {
get { ref.value } // Чтение — используем общие данные
set {
// Ключевой момент: копируем только если ссылка не уникальна
if !isKnownUniquelyReferenced(&ref) {
ref = Ref(newValue) // Создаем новое хранилище
return
}
// Если ссылка уникальна — модифицируем существующие данные
ref.value = newValue
}
}
}
Как это работает:
CoWBox— это структура. При присваивании (let box2 = box1) копируется только ссылкаref, а не сами данные.- При чтении
valueданные используются напрямую из общего хранилища. - При записи в
valueпроверяется функцияisKnownUniquelyReferenced(&ref). Она возвращаетtrue, если на объектRefесть только одна ссылка (этот экземплярCoWBox— его единственный владелец).- Если
true— можно безопасно менять данные «на месте». - Если
false— значит, данные разделяют другие экземплярыCoWBox. Создается новый объектRefс новым значением, и дальнейшие изменения не затронут другие копии.
- Если
Где используется: Именно так реализованы стандартные коллекции Swift (Array, Dictionary, Set, String), что делает их эффективными при передаче по значению.