Všechny tyto property wrappery říkají SwiftUI, a . Klíčové rozdělení je mezi (, ) a (, , ), plus kdo zodpovídá za životnost objektu.
@State@Binding@StateObject@ObservedObject@EnvironmentObject// Hodnotový stav VLASTNĚNÝ tímto view
struct Toggle: View {
@State private var isOn = false // lokální zdroj pravdy
var body: some View {
Switch(isOn: $isOn) // $ vytvoří Binding
}
}
// Obousměrná reference na stav vlastněný JINDE
struct Switch: View {
@Binding var isOn: Bool // žádné vlastnictví; čte+zapisuje rodiče
var body: some View { Button("\(isOn)") { isOn.toggle() } }
}
final class CartModel: ObservableObject {
@Published var items: [Item] = [] // změna => view se překreslí
}
struct CartScreen: View {
@StateObject private var model = CartModel() // VLASTNÍ: vytvořen jednou, přežije překreslení
var body: some View { CartList(model: model) }
}
struct CartList: View {
@ObservedObject var model: CartModel // pozoruje; vlastněn rodičem
var body: some View { Text("\(model.items.count)") }
}
| Wrapper | Typ | Vlastnictví | Použít když |
|---|---|---|---|
@State | hodnota | toto view | jednoduchý lokální stav |
@Binding | hodnota | rodič | potomek upravuje stav rodiče |
@StateObject | reference | toto view (vytvořeno jednou) | view vytváří model |
@ObservedObject | reference | jinde | model je předán dovnitř |
@EnvironmentObject | reference | předek | sdíleno hluboko ve stromu |
@StateObject vs. @ObservedObject je klasická past. Vytvoření modelu pomocí @ObservedObject var m = Model() jej znovu instancuje při každém překreslení a tiše ztrácí stav. Používejte @StateObject všude, kde view objekt vytváří.@EnvironmentObject spadne za běhu, pokud jej žádný předek nevložil přes .environmentObject(...).Volba nesprávného wrapperu je zdrojem číslo jedna chyb stavu ve SwiftUI — blikající hodnoty, resety při scrollování nebo view, která se nikdy neaktualizují. Tazatelé se na to ptají, protože odpověď na @StateObject vs. @ObservedObject okamžitě odhalí, zda rozumíte modelu vlastnictví ve SwiftUI.
Knihovna IT otázek k pohovoru s podrobnými odpověďmi — od Junior po Senior.
Přispět