Что такое state, state object и observed object в iOS-разработке?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
State — обертка свойства во SwiftUI, позволяющая управлять локальным состоянием представления. При изменении значения свойства, обернутого в @State, представление автоматически обновляется.
StateObject — обертка свойства во SwiftUI для создания и управления объектами, соответствующими протоколу ObservableObject, которые являются частью жизненного цикла представления. Эффективно для объектов, созданных внутри представления и живущих с ним.
ObservedObject — обертка свойства во SwiftUI для управления ссылками на существующие объекты, соответствующие протоколу ObservableObject, которые были переданы извне. SwiftUI следит за изменениями в этих объектах и обновляет представление.
Сравнительная таблица:
| Обертка | Назначение | Владение | Пример использования |
|---|---|---|---|
@State |
Локальное состояние представления | Представление | Простой счетчик, флаг видимости |
@StateObject |
Создание и владение ObservableObject |
Представление | Модель представления (ViewModel), созданная в представлении |
@ObservedObject |
Отслеживание ObservableObject, переданного |
Внешний источник | Модель представления (ViewModel), переданная из родительского представления |
Пример использования @State:
struct CounterView: View {
@State private var count: Int = 0 // Локальное состояние
var body: some View {
VStack {
Text("Count: \(count)")
Button("Increment") {
count += 1 // Изменение состояния вызывает обновление
}
}
}
}
Пример использования @StateObject и @ObservedObject:
import SwiftUI
// ObservableObject для модели данных
class DataModel: ObservableObject {
@Published var value: String
init(value: String) {
self.value = value
}
}
struct ContentView: View {
// Создаем и владеем экземпляром DataModel
@StateObject private var localData = DataModel(value: "Initial Local Value")
var body: some View {
VStack {
Text("Local Data: \(localData.value)")
Button("Change Local Data") {
localData.value = "Changed Local Value \(Int.random(in: 1...100))"
}
// Передаем localData в дочернее представление
ChildView(observedData: localData)
}
}
}
struct ChildView: View {
// Отслеживаем экземпляр DataModel, переданный из родителя
@ObservedObject var observedData: DataModel
var body: some View {
VStack {
Text("Observed Data in Child: \(observedData.value)")
Button("Change Observed Data") {
observedData.value = "Changed from Child \(Int.random(in: 1...100))"
}
}
}
}