Когда следует использовать @ObservedObject в SwiftUI?

«Когда следует использовать @ObservedObject в SwiftUI?» — вопрос из категории SwiftUI, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Используйте @ObservedObject для внешних объектов данных, которые:

  1. Реализуют протокол ObservableObject.
  2. Управляются извне текущей View (их жизненным циклом владеет родительская View или другой объект).
  3. Передаются в 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.