Questi property wrapper indicano tutti a SwiftUI e . La divisione fondamentale è tra (, ) e (, , ), più chi è responsabile della durata dell'oggetto.
@State@Binding@StateObject@ObservedObject@EnvironmentObject// Stato value POSSEDUTO da questa view
struct Toggle: View {
@State private var isOn = false // fonte di verità locale
var body: some View {
Switch(isOn: $isOn) // $ crea un Binding
}
}
// Un reference bidirezionale a uno stato posseduto ALTROVE
struct Switch: View {
@Binding var isOn: Bool // nessuna proprietà; legge+scrive nel parent
var body: some View { Button("\(isOn)") { isOn.toggle() } }
}
final class CartModel: ObservableObject {
@Published var items: [Item] = [] // il cambiamento => le view si ri-renderizzano
}
struct CartScreen: View {
@StateObject private var model = CartModel() // POSSIEDE: creato una volta, sopravvive ai re-render
var body: some View { CartList(model: model) }
}
struct CartList: View {
@ObservedObject var model: CartModel // osserva; posseduto da un parent
var body: some View { Text("\(model.items.count)") }
}
| Wrapper | Tipo | Proprietà | Usa quando |
|---|---|---|---|
@State | value | questa view | stato locale semplice |
@Binding | value | un parent | il child modifica lo stato del parent |
@StateObject | reference | questa view (creato una volta) | la view crea il model |
@ObservedObject | reference | altrove | il model viene passato dall'esterno |
@EnvironmentObject | reference | un antenato | condiviso in profondità nell'albero |
@StateObject vs @ObservedObject è la trappola classica. Creare un model con @ObservedObject var m = Model() lo re-istanzia a ogni re-render, perdendo silenziosamente lo stato. Usa @StateObject ovunque la view crei l'oggetto.@EnvironmentObject va in crash a runtime se nessun antenato l'ha iniettato tramite .environmentObject(...).Scegliere il wrapper sbagliato è la causa numero uno dei bug di stato in SwiftUI — valori che tremolano, reset durante lo scroll o view che non si aggiornano mai. Gli intervistatori chiedono questo perché la risposta su @StateObject vs @ObservedObject rivela immediatamente se hai capito il modello di ownership di SwiftUI.
Una raccolta di domande di colloquio IT con risposte dettagliate — da Junior a Senior.
Dona