Ответ
@State и @StateObject — property wrappers для управления состоянием, но для разных типов данных и с разным жизненным циклом.
@State:
- Для value-типов (структуры, примитивы).
- Управляется самой View, уничтожается вместе с ней.
- Используется для локального, простого состояния.
@StateObject:
- Для reference-типов (классы), реализующих
ObservableObject. - Владеет и управляет жизненным циклом объекта.
- Гарантирует, что объект не пересоздается при ререндере View.
Примеры:
@State для локального счетчика:
struct CounterView: View {
@State private var count = 0 // Уничтожится с View
var body: some View {
Button("Tap: (count)") { count += 1 }
}
}
@StateObject для внешней модели данных:
class UserSettings: ObservableObject {
@Published var isLoggedIn = false
}
struct ProfileView: View {
@StateObject private var settings = UserSettings() // Создается один раз
// @ObservedObject var settings — если объект передается извне
var body: some View {
Toggle("Logged In", isOn: $settings.isLoggedIn)
}
}
Ключевое правило: Используйте @StateObject для инициализации и владения ObservableObject, а @ObservedObject — для передачи уже существующего объекта в дочерние View.