Ответ вслух Junior Типы значений и ссылочные спрашивают часто обновлено

Чем struct отличается от class в Swift

Вопрос

Чем структура отличается от класса и как вы выбираете между ними?

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

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

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

Коротко

Структура это тип значения: при присваивании и передаче в функцию получается независимая копия, поэтому её состояние не может неожиданно поменяться из другого места. Класс ссылочный: переменные указывают на один объект, у него есть идентичность (===), наследование, deinit, и его временем жизни управляет ARC.

Что должно прозвучать в ответе

  • Структура тип значения (копия при присваивании), класс ссылочный (общий экземпляр)

  • У класса есть наследование, `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 ошибок.