Ответ
Используйте @ObservedObject для внешних объектов данных, которые:
- Реализуют протокол
ObservableObject. - Управляются извне текущей View (их жизненным циклом владеет родительская View или другой объект).
- Передаются в View через параметр инициализатора.
Типичный сценарий использования:
// 1. Модель данных (внешняя по отношению к View)
class AppSettings: ObservableObject {
@Published var username = "User"
@Published var isDarkMode = false
}
// 2. Родительская View создает и владеет объектом
struct ParentView: View {
@StateObject var settings = AppSettings() // Владение здесь
var body: some View {
ChildView(settings: settings) // Передача во вложенную View
}
}
// 3. Дочерняя View использует @ObservedObject для подписки
struct ChildView: View {
@ObservedObject var settings: AppSettings // Подписка, без владения
var body: some View {
Toggle("Dark Mode", isOn: $settings.isDarkMode)
}
}
| Ключевые отличия от @StateObject: | @StateObject |
@ObservedObject |
|---|---|---|
Создает и владеет экземпляром ObservableObject. |
Только подписывается на существующий экземпляр. | |
| Жизненный цикл привязан к View, которая его объявила. | Жизненный цикл зависит от внешнего владельца. | |
| Используется, когда View источник данных. | Используется, когда View потребитель данных. |
Правило: Если вы создаете объект внутри View, используйте @StateObject. Если получаете его извне (через параметр), используйте @ObservedObject.