Что происходит при копировании массива в Swift?

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

Ответ

Поведение зависит от типа элементов массива. Массивы в Swift имеют семантику копирования при записи (copy-on-write).

  • Изначально присваивание создает новую переменную, которая ссылается на те же самые данные в памяти.
  • Изменение одной из копий (при условии, что она не единственная) может привести к фактическому копированию данных.

Пример с типами-значениями (например, Int):

var original = [1, 2, 3]
var copy = original // Пока нет реального копирования данных

copy[0] = 10 // В этот момент происходит копирование (copy-on-write)
print(original) // [1, 2, 3] - исходный массив не изменился
print(copy)     // [10, 2, 3]

Пример с ссылочными типами (например, экземплярами классов):

class MyClass { var value = 1 }

var arrayA = [MyClass(), MyClass()]
var arrayB = arrayA // Обе переменные ссылаются на один массив объектов

arrayB[0].value = 100 // Меняется свойство у общего объекта
print(arrayA[0].value) // 100 - изменение видно в arrayA

Для создания полной, глубокой копии (особенно для ссылочных типов) необходимо копировать каждый элемент:

// Для классов, поддерживающих копирование
var deepCopy = original.map { $0.copy() }
// Или через инициализатор, если элемент — структура
var deepCopy = original.map { ElementType($0) }