Ezek a property wrapperek mind azt mondják meg a SwiftUI-nak, hogy , és . A lényegi különbség az (, ) és a (, , ) között húzódik, plusz hogy ki felelős az objektum élettartamáért.
Ezek a property wrapperek mind azt mondják meg a SwiftUI-nak, hogy , és . A lényegi különbség az (, ) és a (, , ) között húzódik, plusz hogy ki felelős az objektum élettartamáért.
@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 | Típus | Tulajdonlás | Használd, ha |
|---|---|---|---|
@State | érték | ez a view | egyszerű lokális állapot |
@Binding | érték | egy szülő | a gyerek a szülő állapotát szerkeszti |
@StateObject | referencia | ez a view (egyszer létrehozva) | a view hozza létre a modellt |
@ObservedObject | referencia | máshol | a modellt átadják |
@EnvironmentObject | referencia | ős | mélyen a fában megosztva |
@StateObject vs @ObservedObject a klasszikus csapda. Ha @ObservedObject var m = Model() módon hozol létre egy modellt, az minden újrarenderelésnél újra példányosodik, csendben elveszítve az állapotot. A @StateObject-et használd mindenhol, ahol a view hozza létre az objektumot.@EnvironmentObject futásidőben összeomlik, ha egyetlen ős sem injektálta be az .environmentObject(...) metóduson keresztül.A rossz wrapper kiválasztása a SwiftUI állapothibáinak első számú forrása — villódzó értékek, görgetéskor visszaállások, vagy soha nem frissülő view-k. Az interjúztatók azért kérdezik ezt, mert a @StateObject vs @ObservedObject válasz azonnal elárulja, érted-e a SwiftUI tulajdonlási modelljét.
IT interjúkérdések gyűjteménye részletes válaszokkal — Juniortól Seniorig.
Adományozás