Was ist State, State-Objekt und beobachtetes Objekt in der iOS-Entwicklung?
sobes.tech KI
Antwort von AI
State — ist eine Property-Wrapper in SwiftUI, der es ermöglicht, den lokalen Zustand der Ansicht zu verwalten. Wenn sich der Wert der in @State eingebetteten Property ändert, wird die Ansicht automatisch aktualisiert.
StateObject — ist ein Property-Wrapper in SwiftUI zum Erstellen und Verwalten von Objekten, die dem ObservableObject-Protokoll entsprechen und Teil des Lebenszyklus der Ansicht sind. Effizient für Objekte, die innerhalb der Ansicht erstellt werden und mit ihr leben.
ObservedObject — ist ein Property-Wrapper in SwiftUI zum Verwalten von Referenzen auf bestehende Objekte, die dem ObservableObject-Protokoll entsprechen und von außen übergeben wurden. SwiftUI überwacht Änderungen an diesen Objekten und aktualisiert die Ansicht.
Vergleichstabelle:
| Wrapper | Zweck | Besitz | Beispielanwendung |
|---|---|---|---|
@State |
Lokaler Zustand der Ansicht | Ansicht | Einfacher Zähler, Sichtbarkeits-Flag |
@StateObject |
Erstellen und Besitz von ObservableObject |
Ansicht | ViewModel, das in der Ansicht erstellt wurde |
@ObservedObject |
Überwachung eines übergebenen ObservableObject |
Externe Quelle | ViewModel, das von einer Elternansicht übergeben wurde |
Beispiel für @State:
struct CounterView: View {
@State private var count: Int = 0 // Lokaler Zustand
var body: some View {
VStack {
Text("Count: \(count)")
Button("Inkrementieren") {
count += 1 // Zustandsänderung löst Aktualisierung aus
}
}
}
}
Beispiel für @StateObject und @ObservedObject:
import SwiftUI
// ObservableObject für das Datenmodell
class DataModel: ObservableObject {
@Published var value: String
init(value: String) {
self.value = value
}
}
struct ContentView: View {
// Erstellen und besitzen einer Instanz von DataModel
@StateObject private var localData = DataModel(value: "Initialer Lokaler Wert")
var body: some View {
VStack {
Text("Lokale Daten: \(localData.value)")
Button("Lokale Daten ändern") {
localData.value = "Geänderter Lokaler Wert \(Int.random(in: 1...100))"
}
// Übergabe von localData an eine Kind-View
ChildView(observedData: localData)
}
}
}
struct ChildView: View {
// Überwachen der Instanz von DataModel, die vom Elternteil übergeben wurde
@ObservedObject var observedData: DataModel
var body: some View {
VStack {
Text("Beobachtete Daten im Kind: \(observedData.value)")
Button("Daten im Kind ändern") {
observedData.value = "Geändert vom Kind \(Int.random(in: 1...100))"
}
}
}
}