Что такое Copy-on-Write (CoW) в Swift?

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

Ответ

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

Как это работает в Swift:

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

// Модификация триггерит копирование:
copiedArray.append(4) // Здесь создается физическая копия данных для `copiedArray`.

print(originalArray) // [1, 2, 3]
print(copiedArray)   // [1, 2, 3, 4]

Ключевые аспекты:

  • Экономия ресурсов: Память не расходуется на копии, которые никогда не будут изменены.
  • Автоматизация: Swift автоматически реализует CoW для своих стандартных типов-значений (Array, Dictionary, Set, String) и пользовательских структур, хранящих данные в куче.
  • Ручная реализация: Для собственных структур, которым нужна эта оптимизация, можно использовать isKnownUniquelyReferenced для проверки уникальности ссылки на хранимые данные.
    
    final class Ref<T> {
    var value: T
    init(_ value: T) { self.value = value }
    }

struct MyCoWStruct { private var ref: Ref var value: T { get { ref.value } set { // Копируем буфер только если на него больше одной ссылки if !isKnownUniquelyReferenced(&ref) { ref = Ref(newValue) } else { ref.value = newValue } } } init(_ value: T) { self.ref = Ref(value) } }