Что происходит при копировании и изменении массивов и вьюшек в Swift
Что проверяют
Различаете ли вы значимые и ссылочные типы и понимаете ли, что присваивание массива и присваивание вьюшки это две разные операции. На этом держится половина багов вида «поменял в одном месте, изменилось в другом».
Как отвечать
Array это структура, то есть значимый тип: после var b = a массивы независимы, изменение одного не видно в другом.
Физического копирования при присваивании при этом не происходит, работает copy on write. Буфер общий, пока его только читают; при первой мутации проверяется, единственная ли это ссылка на буфер, и копия делается, только если ссылок несколько.
var a = [1, 2, 3]
var b = a // буфер общий, копии нет
b.append(4) // буфер разделён, вот теперь копия
// a остался [1, 2, 3], b стал [1, 2, 3, 4]UIView это класс, ссылочный тип. Присваивание копирует ссылку, оба имени указывают на один объект, и смена цвета через одно имя видна через другое. Отсюда же разница в поведении let: константная ссылка на вьюшку не мешает менять её свойства, а константный массив изменить нельзя вовсе.
Отдельно стоит сказать про массив объектов: [UIView] копируется как значение, но внутри лежат ссылки, поэтому копия массива это копия списка ссылок, а сами вьюшки остаются общими.
Где спотыкаются
Говорят, что присваивание массива сразу копирует данные. Копия ленивая, и практический вывод из этого обратный ожидаемому: лишняя ссылка на массив, захват в замыкании или второе свойство, делает каждую мутацию полным копированием. Непонятные просадки в цикле обычно про это.
Второе: пытаются продублировать вьюшку. UIView не реализует NSCopying, и вызов copy() кончается падением в рантайме. Дубликат делают конструктором или через архивацию, и в обоих случаях не переезжают ограничения автолейаута и ссылки на делегатов. Плюс вьюшка живёт ровно в одном суперпредставлении: addSubview переносит её из старого, а не создаёт вторую.
Третье: ждут значимой семантики от содержимого. Массив классов, скопированный «на всякий случай», ни от чего не защищает, менять будут те же самые объекты. До элементов значимое поведение доходит только тогда, когда элементы сами структуры.