Wat is de state, state object en observed object in iOS-ontwikkeling?
sobes.tech AI
Antwoord van AI
State — is een property wrapper in SwiftUI waarmee je de lokale toestand van een view kunt beheren. Wanneer de waarde van de in @State ingepakte property verandert, wordt de view automatisch bijgewerkt.
StateObject — is een property wrapper in SwiftUI voor het creëren en beheren van objecten die voldoen aan het ObservableObject-protocol, en die deel uitmaken van de levenscyclus van de view. Efficiënt voor objecten die binnen de view worden gemaakt en ermee leven.
ObservedObject — is een property wrapper in SwiftUI voor het beheren van referenties naar bestaande objecten die voldoen aan het ObservableObject-protocol, en die van buiten zijn doorgegeven. SwiftUI volgt de veranderingen in deze objecten en werkt de view bij.
Vergelijkingstabel:
| Wrapper | Doel | Eigendom | Voorbeeldgebruik |
|---|---|---|---|
@State |
Lokale toestand van de view | De view | Eenvoudige teller, zichtbaarheidsvlag |
@StateObject |
Creëren en beheren van ObservableObject |
De view | ViewModel dat in de view is gemaakt |
@ObservedObject |
Volgen van een doorgegeven ObservableObject |
Externe bron | ViewModel dat van een ouder is doorgegeven |
Voorbeeld van @State:
struct CounterView: View {
@State private var count: Int = 0 // Lokale toestand
var body: some View {
VStack {
Text("Count: \(count)")
Button("Verhoog") {
count += 1 // Verandering in toestand veroorzaakt update
}
}
}
}
Voorbeeld van @StateObject en @ObservedObject:
import SwiftUI
// ObservableObject voor het datamodel
class DataModel: ObservableObject {
@Published var value: String
init(value: String) {
self.value = value
}
}
struct ContentView: View {
// Maak en bezit een instantie van DataModel
@StateObject private var localData = DataModel(value: "Initiële lokale waarde")
var body: some View {
VStack {
Text("Lokale data: \(localData.value)")
Button("Wijzig lokale data") {
localData.value = "Veranderde lokale waarde \(Int.random(in: 1...100))"
}
// Geef localData door aan een kindview
ChildView(observedData: localData)
}
}
}
struct ChildView: View {
// Volg de instantie van DataModel die van de ouder is doorgegeven
@ObservedObject var observedData: DataModel
var body: some View {
VStack {
Text("Geobserveerde data in kind: \(observedData.value)")
Button("Wijzig geobserveerde data") {
observedData.value = "Veranderd vanuit kind \(Int.random(in: 1...100))"
}
}
}
}