Dessa property wrappers talar alla om för SwiftUI och . Den centrala uppdelningen är (, ) kontra (, , ), plus vem som ansvarar för objektets livslängd.
Dessa property wrappers talar alla om för SwiftUI och . Den centrala uppdelningen är (, ) kontra (, , ), plus vem som ansvarar för objektets livslängd.
@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 | Ägarskap | Använd när |
|---|---|---|---|
@State | value | denna vy | enkelt lokalt tillstånd |
@Binding | value | en förälder | barnet redigerar förälderns tillstånd |
@StateObject | reference | denna vy (skapas en gång) | vyn skapar modellen |
@ObservedObject | reference | någon annanstans | modellen skickas in |
@EnvironmentObject | reference | en förfader | delat djupt i trädet |
@StateObject kontra @ObservedObject är den klassiska fällan. Att skapa en modell med @ObservedObject var m = Model() återinstansierar den vid varje omrendering och förlorar tillstånd tyst. Använd @StateObject överallt där vyn skapar objektet.@EnvironmentObject kraschar vid körning om ingen förfader injicerade det via .environmentObject(...).Att välja fel wrapper är den vanligaste källan till SwiftUI-tillståndsbuggar — flimrande värden, återställningar vid scroll, eller vyer som aldrig uppdateras. Intervjuare frågar detta eftersom svaret om @StateObject kontra @ObservedObject omedelbart avslöjar om du förstår SwiftUI:s ägarskapsmodell.
Ett bibliotek med IT-intervjufrågor och detaljerade svar — från Junior till Senior.
Donera