Вопрос проверяет понимание компромисса между безопасностью value-типа и производительностью reference-типа.
Массивы в Swift являются value-типами по поведению, но внутри используют ссылочное хранилище. Это сделано ради производительности и эффективного использования памяти. Благодаря copy-on-write несколько массивов могут делить одно хранилище без риска побочных эффектов. Для разработчика массив всегда ведёт себя как value-тип.
Swift намеренно разделяет внешнюю семантику и внутреннюю реализацию коллекций.
С точки зрения кода:
Array — struct
присваивание копирует значение
изменение не влияет на другие копии
Это и есть value-семантика.
Под капотом:
массив хранит ссылку на буфер в куче
буфер может быть разделён между копиями
реальное копирование откладывается
Таким образом:
данные физически не копируются сразу
копия создаётся только при записи
Без reference-хранилища:
каждый = означал бы полное копирование
работа с коллекциями стала бы слишком дорогой
С reference-хранилищем + CoW:
чтение дешёвое
копирование ленивое
поведение безопасное
Value-семантика — это:
что видит программист
а не то, как данные лежат в памяти
Swift гарантирует:
изоляцию изменений
отсутствие скрытых сайд-эффектов
Массивы в Swift — value-типы по контракту и reference-типы по реализации. Copy-on-write позволяет совместить безопасность и производительность.