Какие преимущества дает использование value types в Swift
Что проверяют
Понимаете ли вы, что главное преимущество это локальность рассуждений, а не размещение на стеке.
Как отвечать
Значимый тип копируется при присваивании и передаче. Отсюда все выгоды:
- никто не изменит ваше значение за спиной. Передали структуру в функцию, и что бы там ни делали, ваш экземпляр останется прежним. С классом такой гарантии нет, и приходится держать в голове, кто ещё держит ссылку. Это и называют локальностью рассуждений: чтобы понять код, достаточно посмотреть на него, а не на всю программу;
- не нужны защитные копии. При работе со ссылочными типами приходится копировать объект перед сохранением, иначе вызывающий изменит его позже;
- потокобезопасность по построению: значение не разделяется, поэтому гонок нет. Именно поэтому в модели структурированной конкурентности значимые типы естественно подходят под требование безопасной передачи между задачами;
- нет подсчёта ссылок для структур из простых полей, а значит нет ни накладных расходов на атомарные операции со счётчиком, ни возможности получить цикл удержания. Циклы это одна из главных причин утечек, и со структурами их просто не бывает;
- нет идентичности, поэтому равенство определяется содержимым, а сравнение реализуется компилятором;
- лучше оптимизируется: компилятор может разместить значение на стеке и раскрыть его по полям.
Про стоимость копирования: у коллекций и строк работает копирование при записи, поэтому присваивание дёшево, а реальное копирование происходит только при изменении и только если буфер разделяется.
Когда всё-таки класс: нужна идентичность (один объект, на который все смотрят), требуется наследование, идёт взаимодействие с Objective-C, либо состояние большое и копирование действительно дорого.
Главная ловушка: большая изменяемая структура. Копирование стоит времени, а изменения теряются, потому что из свойства или коллекции возвращается копия.
Где спотыкаются
Объясняют преимущества только размещением на стеке.
Делают крупные изменяемые структуры и удивляются расходам.
Не знают про копирование при записи и боятся передавать массивы.
Используют класс по привычке там, где нужна простая модель данных.