ObservedObject, EnvironmentObject, StateObject
Mikhail PushkarevПривет друг 🙂 Рад тебя видеть на новой теме. Скажу так, это сложно понять в теории, но легче понять как это работает на практике.
От слову к делу..
о ObservedObject...
Чтобы понять как работает ObservedObject, рассмотрим пример со State:
На видео я показывал как работать с данными. Это тебе пригодится когда ты будешь изучать базу данных. А вот форма записи без использования структуры:

Что такое @StateObject?
Где-то между @State и @ObservedObject лежит @StateObject. Это специализированная версия @ObservedObject, и она работает почти так же: ты должен соответствовать протоколу ObservableObject и ты можешь использовать @Published, чтобы пометить свойства как вызывающие уведомления об изменениях, и любые представления, которые наблюдают за @StateObject, будут обновляться и их тело тоже.

Окей. Почти ничего не изменилось, ты спросишь, а в чем тогда различие между @StateObject и @ObservedObject ?
Есть одно важное различие между @StateObject и @ObservedObject, а именно право собственности - какое представление создало объект, а какое - просто наблюдает за ним.
Правило таково: какое бы представление ни создавало твой объект первым, оно должно использовать @StateObject, чтобы сообщить SwiftUI, что он является владельцем данных и отвечает за их сохранение. Все другие представления должны использовать @ObservedObject, чтобы сообщить SwiftUI, что они хотят отслеживать изменения объекта, но не владеют им напрямую.
Что такое @EnvironmentObject?
Более детально предлагаю тебе ознакомится с @EnvironmentObject на данном примере. Выпиши себе этот код ниже в тестовый проект и поиграйся с ним.

Что же такое @EnvironmentObject? Это значение, которое становится доступным для твоих представлений через само приложение - это общие данные, которые каждое представление может прочитать при желании. Итак, если в твоем приложении есть некоторые важные данные модели, которые необходимо прочитать всем представлениям, ты можешь либо передать их из представления в представление для просмотра, либо просто поместить в среду, где каждое представление имеет к нему мгновенный доступ.
Думай о @EnvironmentObject как о большом удобстве для тех случаев, когда тебе нужно передать много данных по твоему приложению. Поскольку все представления указывают на одну и ту же модель, если одно представление изменяет модель, все представления немедленно обновляются - нет риска рассинхронизации различных частей твоего приложения.
Проще говоря @EnvironmentObject тебе понадобится для обновления твоих данных с базы данных. Вот такая тавтология получается 🙂
Подведем итог:
- @State - обеспечивает привязку к свойству, владеет состоянием, используется для типов значений
- @Published - позволяющая нам создавать наблюдаемые объекты, которые автоматически сообщают, когда происходят изменения.
- @Binding - обеспечивает привязку к свойству, не имеет собственного состояния, может использоваться для типов значений (и свойств ссылочных типов, которые являются типами значений!)
- @ObservedObject - обеспечивает привязку к свойствам наблюдаемого объекта, не имеет собственного состояния, инициализирован где-то еще, используется для ссылочных типов
- @EnvironmentObject - обеспечивает привязку к свойствам объекта среды, не имеет собственного состояния, инициализируется где-то еще, передается через environmentObject (_ :)
- @StateObject - обеспечивает привязку к свойствам объекта состояния, владеет состоянием, инициализируется локально, используется для ссылочных типов
Обязательные ссылки для изучения:
- Документация на ObservedObject и доп ссылка
- Документация на Published и доп ссылка
- Документация на StateObject и доп ссылка
- Документация на EnvironmentObject и доп ссылка