Всегда ли при присваивании структуры в Swift создается полная физическая копия?

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

Ответ

Нет, не всегда. Swift стремится избегать излишних копий для повышения эффективности, сохраняя при этом гарантии value-семантики.

Что происходит на самом деле:

  1. Логическое копирование происходит сразу. Две переменные становятся независимыми с точки зрения языка.
  2. Физическое копирование данных откладывается до первой модификации одной из копий благодаря Copy-on-Write (CoW).

Пример с CoW:

struct LargeStruct { var data: [Int] = Array(1...1000) }

var a = LargeStruct()
var b = a // Логическая копия. Физически `a.data` и `b.data`
          // могут указывать на один массив в памяти (нет копирования 1000 элементов).

b.data.append(1001) // ТЕПЕРЬ, при модификации `b`, происходит реальное
                    // копирование внутреннего массива (`data`).

Оптимизации компилятора: Для простых, небольших структур (например, Point с двумя Int) компилятор может пропустить даже логическую отложенность и выполнить копирование сразу, так как это дешево.

Вывод: Swift гарантирует семантику копирования по значению (изменение одной копии не влияет на другую), но реализация использует оптимизации (CoW), чтобы физическое копирование происходило только при необходимости.