Sobes.tech
Middle

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