В чем разница между @State и @ObservedObject в SwiftUI?

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

Ответ

@State и @ObservedObject — это property wrappers для управления состоянием, но с разными областями применения.

@State

  • Назначение: Хранение локального, приватного состояния внутри конкретной View.
  • Типы данных: Примитивы (Int, String, Bool) или value-типы (struct, enum). SwiftUI управляет памятью.
  • Область видимости: Данные принадлежат и уничтожаются вместе с View.
  • Использование: Для простого состояния, не выходящего за пределы View.
struct CounterView: View {
    @State private var count = 0 // Локальное состояние
    var body: some View {
        Button("Tap: (count)") { count += 1 }
    }
}

@ObservedObject

  • Назначение: Подписка на изменения во внешнем, разделяемом источнике данных.
  • Типы данных: Reference-типы (классы), conforming к ObservableObject. Изменения в @Published свойствах объекта приводят к обновлению View.
  • Владение: View не владеет объектом, а лишь наблюдает за ним. Объект должен быть передан извне (например, родительской View или окружения).
  • Использование: Для сложных моделей данных, используемых несколькими View.
class UserSettings: ObservableObject {
    @Published var username = "Alex"
}

struct ProfileView: View {
    @ObservedObject var settings: UserSettings // Внешний источник данных
    var body: some View {
        TextField("Name", text: $settings.username)
    }
}

Ключевое отличие: @State — для локального состояния View, @ObservedObject — для наблюдения за внешним, разделяемым объектом.