Ces property wrappers indiquent tous à SwiftUI et . La distinction clé est celle entre l' (, ) et l' (, , ), plus la question de savoir qui est responsable de la durée de vie de l'objet.
@State@Binding@StateObject@ObservedObject@EnvironmentObject// État value POSSÉDÉ par cette vue
struct Toggle: View {
@State private var isOn = false // source de vérité locale
var body: some View {
Switch(isOn: $isOn) // $ crée un Binding
}
}
// Une référence bidirectionnelle vers un état possédé AILLEURS
struct Switch: View {
@Binding var isOn: Bool // aucune possession ; lit et écrit chez le parent
var body: some View { Button("\(isOn)") { isOn.toggle() } }
}
final class CartModel: ObservableObject {
@Published var items: [Item] = [] // changement => les vues refont leur rendu
}
struct CartScreen: View {
@StateObject private var model = CartModel() // POSSÈDE : créé une fois, survit aux re-rendus
var body: some View { CartList(model: model) }
}
struct CartList: View {
@ObservedObject var model: CartModel // observe ; possédé par un parent
var body: some View { Text("\(model.items.count)") }
}
| Wrapper | Type | Possession | À utiliser quand |
|---|---|---|---|
@State | value | cette vue | état local simple |
@Binding | value | un parent | l'enfant modifie l'état du parent |
@StateObject | reference | cette vue (créé une fois) | la vue crée le modèle |
@ObservedObject | reference | ailleurs | le modèle est passé en paramètre |
@EnvironmentObject | reference | un ancêtre | partagé en profondeur dans l'arbre |
@StateObject vs @ObservedObject est le piège classique. Créer un modèle avec @ObservedObject var m = Model() le réinstancie à chaque re-rendu, perdant silencieusement l'état. Utilisez @StateObject partout où la vue crée l'objet.@EnvironmentObject plante à l'exécution si aucun ancêtre ne l'a injecté via .environmentObject(...).Choisir le mauvais wrapper est la première cause de bugs d'état dans SwiftUI — valeurs qui clignotent, réinitialisations au défilement, ou vues qui ne se mettent jamais à jour. Les recruteurs posent cette question parce que la réponse sur @StateObject vs @ObservedObject révèle instantanément si vous comprenez le modèle de possession de SwiftUI.
Une bibliothèque de questions d'entretien IT avec des réponses détaillées — du Junior au Senior.
Faire un don