SwiftUI
SwiftUI — декларативный фреймворк Apple для интерфейсов: вместо пошагового изменения элементов вы описываете, как экран выглядит для данного состояния, а фреймворк сам приводит его к этому виду. Экран — это body, чистая функция от состояния: меняется состояние — SwiftUI перевычисляет body и обновляет только то, что изменилось.
Главная перестройка мышления для пришедшего из UIKit — понять «источник истины». Данные хранятся в одном месте (@State), а всё остальное лишь ссылается на них. Дочерний контрол не хранит свою копию — он получает Binding, двустороннюю ссылку на чужое состояние. Компоновка тоже декларативна: не ограничения Auto Layout, а вложенные стеки и модификаторы. Полная карта — в слоях ниже.
Карта темы
- Состояние @State — локальное изменяемое состояние представления, чьё изменение перерисовывает body.
- Связывание Binding — двусторонняя ссылка
$state, дающая дочернему контролу читать и писать чужое значение без владения им. - Декларативная раскладка — композиция экрана из стеков, модификаторов и условного включения view вместо Auto Layout и
isHidden.
Частые ошибки и ловушки
| Ошибка | Последствие |
|---|---|
Считать @State общим для всех экземпляров представления | На деле оно отдельное для каждого экземпляра |
Хранить ссылочную модель в @State | Для объектов нужен @StateObject, иначе жизненный цикл нарушается |
Забыть префикс $ при передаче состояния как binding | Дочерний контрол получит значение, а не двустороннюю ссылку |
Прятать элемент флагом isHidden | Не декларативно; в SwiftUI используют условное включение if ... |
Тянуть Auto Layout и NSLayoutConstraint в body | Игнорирование стеков и модификаторов, борьба с фреймворком |
| Считать body разовым построением экрана | body перевычисляется при каждом изменении состояния |
Значение для собеседований
SwiftUI спрашивают, чтобы проверить, усвоили ли вы декларативную модель или просто переносите привычки UIKit. Кандидат, который говорит «body — это функция от состояния, а @State — единственный источник истины, на который Binding лишь ссылается», сразу выглядит сильнее того, кто «прячет метку через isHidden».
Что обычно проверяют:
- Разницу между
@State(владение) иBinding(ссылка) и роль префикса$. - Почему изменение
@Stateперерисовывает body и что body — функция от состояния. - Когда нужен
@StateObjectвместо@Stateдля ссылочных моделей. - Как заменить
isHiddenи Auto Layout декларативной раскладкой.
Типичный неверный ответ: «@State — статическое свойство, общее для всех экземпляров, а Binding — односторонний снимок значения». На самом деле @State — отдельное состояние каждого экземпляра, а Binding — двусторонняя ссылка, отражающая изменения в обе стороны.