Sobes.tech
Middle

Qu'est-ce que l'état, l'objet d'état et l'objet observé dans le développement iOS?

sobes.tech IA

Réponse de l'IA

State — est une enveloppe de propriété dans SwiftUI qui permet de gérer l'état local de la vue. Lorsqu'une valeur de propriété enveloppée dans @State change, la vue se met automatiquement à jour.

StateObject — est une enveloppe de propriété dans SwiftUI pour créer et gérer des objets conformes au protocole ObservableObject, qui font partie du cycle de vie de la vue. Efficace pour les objets créés à l'intérieur de la vue et qui y vivent.

ObservedObject — est une enveloppe de propriété dans SwiftUI pour gérer des références à des objets existants conformes au protocole ObservableObject, qui ont été passés de l'extérieur. SwiftUI surveille les changements dans ces objets et met à jour la vue.

Tableau comparatif:

Enveloppe Objectif Propriété Exemple d'utilisation
@State État local de la vue La vue Compteur simple, drapeau de visibilité
@StateObject Création et gestion de ObservableObject La vue Modèle de vue (ViewModel) créé dans la vue
@ObservedObject Surveillance d'un ObservableObject passé Source externe Modèle de vue (ViewModel) passé depuis un parent

Exemple d'utilisation de @State:

struct CounterView: View {
    @State private var count: Int = 0 // État local

    var body: some View {
        VStack {
            Text("Count: \(count)")
            Button("Incrémenter") {
                count += 1 // La modification de l'état entraîne une mise à jour
            }
        }
    }
}

Exemple d'utilisation de @StateObject et @ObservedObject:

import SwiftUI

// ObservableObject pour le modèle de données
class DataModel: ObservableObject {
    @Published var value: String
    
    init(value: String) {
        self.value = value
    }
}

struct ContentView: View {
    // Créer et posséder une instance de DataModel
    @StateObject private var localData = DataModel(value: "Valeur locale initiale")

    var body: some View {
        VStack {
            Text("Données locales : \(localData.value)")
            Button("Changer données locales") {
                localData.value = "Valeur modifiée localement \(Int.random(in: 1...100))"
            }
            
            // Passer localData à une vue enfant
            ChildView(observedData: localData)
        }
    }
}

struct ChildView: View {
    // Surveiller l'instance de DataModel passée depuis le parent
    @ObservedObject var observedData: DataModel

    var body: some View {
        VStack {
            Text("Données observées dans l'enfant : \(observedData.value)")
            Button("Changer données observées") {
                observedData.value = "Modifié depuis l'enfant \(Int.random(in: 1...100))"
            }
        }
    }
}