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