Sobes.tech
Middle

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))"
            }
        }
    }
}