Vsi ti property wrapperji SwiftUI-ju povedo, in . Ključna delitev je med (, ) in (, , ), poleg tega pa še, kdo je odgovoren za življenjsko dobo objekta.
@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 | Tip | Lastništvo | Uporabi, kadar |
|---|---|---|---|
@State | value | ta pogled | preprosto lokalno stanje |
@Binding | value | starš | otrok ureja starševo stanje |
@StateObject | reference | ta pogled (ustvarjen enkrat) | pogled ustvari model |
@ObservedObject | reference | drugje | model je podan |
@EnvironmentObject | reference | prednik | deljeno globoko v drevesu |
@StateObject proti @ObservedObject je klasična past. Ustvarjanje modela z @ObservedObject var m = Model() ga ob vsakem ponovnem izrisu znova instancira in tiho izgubi stanje. Uporabi @StateObject povsod, kjer pogled ustvari objekt.@EnvironmentObject se ob izvajanju sesuje, če ga noben prednik ni vbrizgal prek .environmentObject(...).Izbira napačnega wrapperja je vir številka ena za hrošče stanja v SwiftUI — utripajoče vrednosti, ponastavitve ob drsenju ali pogledi, ki se nikoli ne posodobijo. Spraševalci to vprašajo, ker odgovor na @StateObject proti @ObservedObject v hipu razkrije, ali razumeš SwiftUI-jev model lastništva.
Knjižnica IT vprašanj za razgovore s podrobnimi odgovori — od začetnika do izkušenega.
Doniraj