Wszystkie te property wrappers mówią SwiftUI, i . Kluczowy podział to (, ) kontra (, , ), plus kto odpowiada za czas życia obiektu.
@State@Binding@StateObject@ObservedObject@EnvironmentObject// Stan wartościowy POSIADANY przez ten widok
struct Toggle: View {
@State private var isOn = false // lokalne źródło prawdy
var body: some View {
Switch(isOn: $isOn) // $ tworzy Binding
}
}
// Dwukierunkowa referencja do stanu posiadanego GDZIE INDZIEJ
struct Switch: View {
@Binding var isOn: Bool // brak własności; odczyt+zapis rodzica
var body: some View { Button("\(isOn)") { isOn.toggle() } }
}
final class CartModel: ObservableObject {
@Published var items: [Item] = [] // zmiana => widoki re-renderują
}
struct CartScreen: View {
@StateObject private var model = CartModel() // POSIADA: tworzone raz, przeżywa re-rendery
var body: some View { CartList(model: model) }
}
struct CartList: View {
@ObservedObject var model: CartModel // obserwuje; posiadane przez rodzica
var body: some View { Text("\(model.items.count)") }
}
| Wrapper | Typ | Własność | Użyj gdy |
|---|---|---|---|
@State | wartość | ten widok | prosty lokalny stan |
@Binding | wartość | rodzic | dziecko edytuje stan rodzica |
@StateObject | referencja | ten widok (tworzone raz) | widok tworzy model |
@ObservedObject | referencja | gdzie indziej | model przekazany z zewnątrz |
@EnvironmentObject | referencja | przodek | współdzielony głęboko w drzewie |
@StateObject vs @ObservedObject to klasyczna pułapka. Utworzenie modelu przez @ObservedObject var m = Model() tworzy go od nowa przy każdym re-renderze, po cichu tracąc stan. Używaj @StateObject wszędzie tam, gdzie widok tworzy obiekt.@EnvironmentObject powoduje awarię w czasie wykonania, jeśli żaden przodek nie wstrzyknął go przez .environmentObject(...).Wybór złego wrappera jest najczęstszym źródłem błędów stanu w SwiftUI — migające wartości, resety przy przewijaniu lub widoki, które nigdy się nie aktualizują. Rekruterzy pytają o to, ponieważ odpowiedź na @StateObject vs @ObservedObject natychmiast ujawnia, czy rozumiesz model własności SwiftUI.
Biblioteka pytań rekrutacyjnych IT ze szczegółowymi odpowiedziami — od Juniora do Seniora.
Wesprzyj