Ответ
Нет, copy-on-write не свойство всех value type.
Снаружи это всё равно value type: правка одной копии не меняет другую. Данные копируют не при присваивании, а в момент изменения, и только если ими ещё пользуется другая переменная.
По умолчанию механизм есть у таких типов:
Array,ContiguousArray,Dictionary,Set,StringArraySlice,SubstringData,AttributedString
Обычный struct копирует поля сразу. Copy-on-write у него нужно делать самому, т.е. class в куче и isKnownUniquelyReferenced перед записью.
Нет. Обычный struct при присваивании копирует свои поля. Copy-on-write у него сам не появляется.
Его дают типы стандартной библиотеки с большим буфером: Array, Dictionary, Set, String. Свой тип получает такую семантику, только если её написать: хранить данные в классе-буфере и копировать буфер при записи, когда ссылка не единственная.
Поле-класс внутри структуры тоже не включает copy-on-write. Копируется ссылка, а объект остаётся общим, пока код сам не отделит копию.