Какво е състояние, обект на състояние и наблюдаван обект в 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))"
}
}
}
}