Как в Swift отследить момент копирования структуры?

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

Ответ

Прямого механизма для отслеживания автоматического копирования структур (copy-on-write) в Swift не существует. Однако можно реализовать кастомное копирование с логированием.

Практические подходы:

  1. Кастомный метод копирования:

    struct TrackableStruct {
        var id: Int
    
        func copied() -> TrackableStruct {
            print("Создана копия структуры с id: (id)")
            return TrackableStruct(id: self.id)
        }
    }
    
    let original = TrackableStruct(id: 1)
    let copy = original.copied() // Логируется
  2. Для классов с протоколом NSCopying:

    class MyClass: NSCopying {
        var data: String
    
        init(data: String) { self.data = data }
    
        func copy(with zone: NSZone? = nil) -> Any {
            print("Копирование MyClass")
            return MyClass(data: self.data)
        }
    }

Важно: Swift использует оптимизацию copy-on-write для стандартных типов и собственных структур. Явное копирование происходит только при изменении одной из переменных, ссылающихся на одни и те же данные. Отследить это системное поведение без модификации низкоуровневого кода невозможно.