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

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

Ответ

@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.