Diese Property Wrapper teilen SwiftUI allesamt mit, und . Die zentrale Unterscheidung liegt zwischen (, ) und (, , ) sowie der Frage, wer für die Lebensdauer des Objekts verantwortlich ist.
@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 | Typ | Besitz | Verwenden, wenn |
|---|---|---|---|
@State | Value | diese View | einfacher lokaler Zustand |
@Binding | Value | ein Parent | Child bearbeitet den Zustand des Parents |
@StateObject | Reference | diese View (einmal erzeugt) | View erzeugt das Model |
@ObservedObject | Reference | anderswo | Model wird übergeben |
@EnvironmentObject | Reference | Vorfahre | tief im Baum geteilt |
@StateObject vs. @ObservedObject ist die klassische Falle. Ein Model mit @ObservedObject var m = Model() zu erzeugen, instanziiert es bei jedem Re-Render neu und verliert dabei unbemerkt den Zustand. Verwende @StateObject überall dort, wo die View das Objekt erzeugt.@EnvironmentObject stürzt zur Laufzeit ab, wenn kein Vorfahre es via .environmentObject(...) injiziert hat.Den falschen Wrapper zu wählen ist die häufigste Ursache für SwiftUI-State-Bugs — flackernde Werte, Resets beim Scrollen oder Views, die sich nie aktualisieren. Interviewer fragen das, weil die Antwort auf @StateObject vs. @ObservedObject sofort verrät, ob du SwiftUIs Besitzmodell verstehst.
Eine Sammlung von IT-Interviewfragen mit ausführlichen Antworten — vom Junior bis zum Senior.
Spenden