Стейт, объекти стейт ва объекти мушоҳидашуда дар таҳияи iOS чист?
sobes.tech AI
Ҷавоб аз 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: "Начальная локальная значение")
var body: some View {
VStack {
Text("Локальные данные: \(localData.value)")
Button("Изменить локальные данные") {
localData.value = "Измененное локальное значение \(Int.random(in: 1...100))"
}
// Передаем localData в дочернее представление
ChildView(observedData: localData)
}
}
}
struct ChildView: View {
// Следим за экземпляром DataModel, переданным из родителя
@ObservedObject var observedData: DataModel
var body: some View {
VStack {
Text("Следимые данные в ребенке: \(observedData.value)")
Button("Изменить следимые данные") {
observedData.value = "Изменено из ребенка \(Int.random(in: 1...100))"
}
}
}
}