Disse property wrappers fortæller alle SwiftUI, , og . Den vigtigste opdeling er (, ) kontra (, , ), plus hvem der er ansvarlig for objektets levetid.
@State@Binding@StateObject@ObservedObject@EnvironmentObject// Value state OWNED by this view
struct Toggle: View {
@State private var isOn = false // local source of truth
var body: some View {
Switch(isOn: $isOn) // $ makes a Binding
}
}
// A two-way reference to state owned ELSEWHERE
struct Switch: View {
@Binding var isOn: Bool // no ownership; reads+writes parent
var body: some View { Button("\(isOn)") { isOn.toggle() } }
}
final class CartModel: ObservableObject {
@Published var items: [Item] = [] // change => views re-render
}
struct CartScreen: View {
@StateObject private var model = CartModel() // OWNS: created once, survives re-renders
var body: some View { CartList(model: model) }
}
struct CartList: View {
@ObservedObject var model: CartModel // observes; owned by a parent
var body: some View { Text("\(model.items.count)") }
}
| Wrapper | Type | Ejerskab | Brug når |
|---|---|---|---|
@State | value | dette view | simpel lokal state |
@Binding | value | en parent | child redigerer parents state |
@StateObject | reference | dette view (oprettet én gang) | view opretter modellen |
@ObservedObject | reference | andetsteds | model sendes ind |
@EnvironmentObject | reference | ancestor | delt dybt i træet |
@StateObject kontra @ObservedObject er den klassiske fælde. At oprette en model med @ObservedObject var m = Model() re-instantierer den ved hver re-render og mister lydløst state. Brug @StateObject, hvor viewet opretter objektet.@EnvironmentObject crasher ved runtime, hvis ingen ancestor injicerede det via .environmentObject(...).At vælge den forkerte wrapper er den største kilde til SwiftUI-state-bugs — flimrende værdier, nulstillinger ved scroll eller views, der aldrig opdaterer. Interviewere spørger om dette, fordi svaret på @StateObject kontra @ObservedObject øjeblikkeligt afslører, om du forstår SwiftUI's ejerskabsmodel.
Et bibliotek af IT-interviewspørgsmål med detaljerede svar — fra Junior til Senior.
Donér