В Swift у нас есть ссылочные типы (классы) и типы значений (структуры, кортежи, перечисления). Типы значений имеют семантику копирования. Это означает, что если вы назначаете тип значения переменной или передаете его в качестве параметра функции (если это не параметр inout), базовые данные этого значения будут скопированы. У вас будет два значения с одинаковым содержимым, но выделенные в двух разных адресах памяти. Для более подробного объяснения разницы между типами ссылок и значений в блоге Apple или в нашей статье. Поскольку мы будем говорить о Copy-on-Write, очень важно понимать семантику value в Swift. Что это за копирование при записи? В Swift, когда у вас есть большой тип значения и вам нужно назначить его другому объекту или передать функции в качестве параметра, копирование может быть очень дорогим с точки зрения производительности, потому как вам придется скопировать все базовые данные в другое место в памяти. Чтобы свести к минимуму эту проблему, библиотека Swift реализует м