Ответ
@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 — для наблюдения за внешним, разделяемым объектом.