В чем разница value type и reference type в Swift и когда использовать каждый
Что проверяют
Понимаете ли вы семантику копирования и почему в Swift по умолчанию берут структуру, а не класс.
Как отвечать
Значимые типы (struct, enum, кортежи, а также Array, String, Dictionary) копируются при присваивании и передаче. Ссылочные (class, замыкания) передают ссылку на общий экземпляр.
struct Point { var x = 0 }
var a = Point(); var b = a; b.x = 5 // a.x остался 0
class Box { var x = 0 }
let p = Box(); let q = p; q.x = 5 // p.x стал 5Копирование дешевле, чем кажется: у стандартных коллекций работает копирование при записи, фактическое копирование происходит только при изменении.
Что из этого следует на практике:
- значимый тип не может быть изменён из другого места неожиданно, поэтому он безопаснее в многопоточном коде и понятнее в отладке;
- ссылочный тип нужен, когда объект по смыслу один и его состояние разделяют: контроллер, менеджер сети, кэш. Ещё когда нужны наследование или
deinit, а также при работе с наследием Objective-C; - у классов есть идентичность (
===), у структур только равенство по значению.
Правило, принятое в языке: начинайте со struct, переходите к class, когда нужна разделяемая изменяемая ссылка или наследование.
Где спотыкаются
Считают копирование массива дорогим, не зная про копирование при записи.
Берут class по привычке и получают неожиданные изменения через вторую ссылку.
Забывают, что замыкание захватывает self сильно, и создают цикл ссылок.
Не могут объяснить, почему let у структуры запрещает менять её поля, а у класса нет.