Ответ вслух Middle SwiftUI спрашивают часто обновлено

Управление состоянием в SwiftUI

Вопрос

Как вы организуете состояние в SwiftUI-приложении?

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

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

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

Коротко

Главный принцип: у каждого значения один источник правды. Мелкое UI-состояние экрана, например открыта ли шторка, живёт в @State самой view.

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

  • Единый источник правды для каждого значения, остальным биндинги

  • Локальное 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 ошибок.