Управление состоянием в SwiftUI
Вопрос
Как вы организуете состояние в SwiftUI-приложении?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Единый источник правды для каждого значения, остальным биндинги
Локальное UI-состояние в `@State`, данные экрана в `@Observable` view model
Владение объектом: `@State` (Observation) или `@StateObject`, а не `@ObservedObject`
Общие сервисы и сессия через environment
Стабильная идентичность: `Identifiable`, без индексов и лишних `if/else`
`body` без побочных эффектов, загрузка в `.task`
Что могут спросить следом
- Как тестировать такую view model?
- Когда вы выносите состояние из view в модель?
Разбор
Главный принцип: у каждого значения один источник правды. Мелкое UI-состояние экрана, например открыта ли шторка, живёт в @State самой view. Данные экрана и логика загрузки в view model: класс с @Observable и @MainActor, которым экран владеет через @State. Дочерние view получают значения или биндинги, а @Bindable, если нужны биндинги к свойствам модели. Общие вещи вроде сессии и роутера кладу в environment. Слежу за идентичностью: ForEach по стабильным id, условия через модификаторы, чтобы не сбрасывать состояние. body держу чистым и дешёвым, загрузку запускаю в .task, чтобы она отменялась при уходе. View model тестирую отдельно юнит-тестами: она не знает про SwiftUI.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.