Вопрос проверяет понимание @StateObject в SwiftUI, который используется для создания и хранения состояния, управляющего жизненным циклом объекта, и нужен для правильного управления источником истины в приложении.
В SwiftUI управление состоянием часто делегируется объектам, которые соответствуют протоколу ObservableObject. Property wrapper @StateObject предназначен для создания и хранения такого объекта непосредственно внутри представления (View). Его ключевая роль — быть источником истины для данных, которые принадлежат этому конкретному представлению и управляют его жизненным циклом.
Когда вы объявляете свойство с @StateObject, SwiftUI создаёт экземпляр указанного класса и берёт на себя ответственность за его хранение. Важно, что этот объект сохраняется при повторных рендерах представления. Без @StateObject объект мог бы создаваться заново при каждом обновлении тела body, что привело бы к потере состояния.
Рассмотрим простой счётчик, состояние которого вынесено в отдельный класс.
import SwiftUI
// Модель, управляющая состоянием
class CounterViewModel: ObservableObject {
@Published var count = 0
func increment() {
count += 1
}
}
// Представление, которое владеет моделью
struct CounterView: View {
@StateObject private var viewModel = CounterViewModel()
var body: some View {
VStack {
Text("Count: \(viewModel.count)")
Button("Increment") {
viewModel.increment()
}
}
}
}В этом примере CounterViewModel создаётся один раз при первой инициализации CounterView. При нажатии кнопки и обновлении интерфейса тот же самый экземпляр viewModel продолжает использоваться, сохраняя актуальное значение count.
Использование @ObservedObject для инициализации объекта внутри представления может привести к неожиданным сбросам состояния, так как при перерисовке может создаться новый экземпляр.
@StateObject применяется в сценариях, где представлению нужен собственный, долгоживущий источник данных. Типичные случаи:
Вывод: Используйте @StateObject для инициализации и владения объектами ObservableObject внутри представлений SwiftUI. Это гарантирует стабильность состояния и предотвращает его потерю, что является фундаментальным для создания предсказуемых и отзывчивых интерфейсов.