Ответ
@ObservedObject — это property wrapper в SwiftUI, который создает подписку представления (View) на изменения внешнего объекта, соответствующего протоколу ObservableObject.
Основная роль:
Он сообщает SwiftUI: "Эта View зависит от данных из внешнего объекта. Перерисуй меня, когда его @Published свойства изменятся".
Пример и сравнение с @StateObject:
class DataModel: ObservableObject {
@Published var value = 0
}
struct ParentView: View {
// @StateObject — для СОЗДАНИЯ и ВЛАДЕНИЯ объектом.
// SwiftUI управляет его жизненным циклом и не уничтожает при перерисовке ParentView.
@StateObject private var myModel = DataModel()
var body: some View {
VStack {
Text("Родитель: (myModel.value)")
// @ObservedObject — для ПЕРЕДАЧИ уже существующего объекта в дочернюю View.
// Дочерняя View подписывается на его изменения, но не владеет им.
ChildView(observedModel: myModel)
}
}
}
struct ChildView: View {
// Получаем объект извне и подписываемся на его изменения.
@ObservedObject var observedModel: DataModel
var body: some View {
Button("Увеличить в дочерней") {
observedModel.value += 1 // Изменение обновит и ParentView, и ChildView
}
}
}
Ключевые правила использования:
- Для внешних зависимостей: Используйте
@ObservedObject, когда объект создается и управляется за пределами текущейView(например, передан из родительскойViewили через@EnvironmentObject). - Не является источником истины:
@ObservedObjectне создает и не хранит объект. Он только создает на него подписку. Если источник данных (родительскаяView) перестанет существовать, объект может быть деинициализирован. - Для создания и владения объектом внутри
Viewвсегда используйте@StateObject. Это предотвращает неожиданное воссоздание объекта при перерисовкеView.