આ બધા property wrapper SwiftUI ને જણાવે છે કે અને . મુખ્ય વિભાજન છે (, ) વિરુદ્ધ (, , ), ઉપરાંત object ના lifetime માટે કોણ જવાબદાર છે.
@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 | Ownership | ક્યારે વાપરવું |
|---|---|---|---|
@State | value | આ view | સાદું local state |
@Binding | value | parent | child parent નું state edit કરે |
@StateObject | reference | આ view (એક વાર બને) | view model બનાવે |
@ObservedObject | reference | બીજે ક્યાંક | model પસાર થાય |
@EnvironmentObject | reference | ancestor | tree માં ઊંડે share |
@StateObject vs @ObservedObject એ classic ફાંદો છે. @ObservedObject var m = Model() થી model બનાવવાથી તે દરેક re-render પર ફરી instantiate થાય છે, ચૂપચાપ state ગુમાવે છે. જ્યાં view object ને બનાવે છે ત્યાં @StateObject વાપરો.@EnvironmentObject runtime પર crash થાય છે જો કોઈ ancestor એ .environmentObject(...) દ્વારા તેને inject ન કર્યું હોય.ખોટો wrapper પસંદ કરવો એ SwiftUI state bug નું નંબર-વન કારણ છે — flickering value, scroll પર reset, અથવા ક્યારેય update ન થતા view. Interviewer આ પૂછે છે કારણ કે @StateObject vs @ObservedObject નો જવાબ તરત જ પ્રગટ કરે છે કે તમે SwiftUI ના ownership model ને સમજો છો કે નહીં.
વિગતવાર જવાબો સાથે IT ઇન્ટરવ્યૂ પ્રશ્નોની લાઇબ્રેરી — જુનિયરથી સિનિયર સુધી.
દાન કરો