Ответ
Нет, не всегда. Swift стремится избегать излишних копий для повышения эффективности, сохраняя при этом гарантии value-семантики.
Что происходит на самом деле:
- Логическое копирование происходит сразу. Две переменные становятся независимыми с точки зрения языка.
- Физическое копирование данных откладывается до первой модификации одной из копий благодаря 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), чтобы физическое копирование происходило только при необходимости.