Чем struct отличается от class в Swift
Вопрос
Чем структура отличается от класса и как вы выбираете между ними?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Структура тип значения (копия при присваивании), класс ссылочный (общий экземпляр)
У класса есть наследование, `deinit`, идентичность `===` и подсчёт ссылок ARC
Структура: почленный init, `mutating` для изменения, `let` замораживает всё значение
Коллекции стандартной библиотеки дешёвые в копировании за счёт copy-on-write
По умолчанию структура; класс, когда нужна идентичность, общий ресурс, наследование или ObjC
Структура с полями-классами теряет семантику значения
Что могут спросить следом
- Где хранится структура: всегда ли на стеке?
- Как бы вы сделали copy-on-write у своей структуры?
- Почему модели для SwiftUI часто структуры, а view model это класс?
Разбор
Структура это тип значения: при присваивании и передаче в функцию получается независимая копия, поэтому её состояние не может неожиданно поменяться из другого места. Класс ссылочный: переменные указывают на один объект, у него есть идентичность (===), наследование, deinit, и его временем жизни управляет ARC. У структуры есть автоматический почленный инициализатор, методы, меняющие её, помечаются mutating, а let замораживает всё значение. Копирование больших коллекций дешёвое благодаря copy-on-write. Выбираю по умолчанию структуру: модели, DTO, конфигурации. Класс беру, когда нужна общая изменяемая сущность (кеш, сервис), наследование от UIKit, deinit или совместимость с Objective-C. Помню ловушку: если в структуре лежит класс, копия разделяет этот объект.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Как работает copy-on-write в Swift
Следующий вопрос
Всегда ли структура лежит на стеке
Ещё по теме «Типы значений и ссылочные»
- Copy-on-write у Array: когда копируется буфер
- Модификаторы borrowing и consuming
- Как сделать свой copy-on-write
- Existential container: как хранится any Protocol
- Типы значений и ссылочные типы в Swift
- Оператор === в Swift
- Зачем indirect у enum
- Задача на Swift: стек отмены для текстового поля