Карточка Senior Типы значений и ссылочные обновлено

Как сделать свой copy-on-write

Вопрос

Как реализовать copy-on-write для своей структуры с большим хранилищем?

Попробуйте сами

Ответьте про себя или вслух, потом откройте ответ и сверьтесь.

Показать ответ и разбор

Коротко

Хранить данные в приватном классе-хранилище. В каждом мутирующем методе проверять isKnownUniquelyReferenced(&storage); если ссылка не уникальна, сначала заменить storage его копией, потом менять.

Ответ

Хранить данные в приватном классе-хранилище. В каждом мутирующем методе проверять isKnownUniquelyReferenced(&storage); если ссылка не уникальна, сначала заменить storage его копией, потом менять.

Разбор

Так устроены Array и String. Важно, чтобы снаружи не было доступа к storage, иначе семантика значения сломается. Проверка уникальности работает только для Swift-классов.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.