Αυτά τα property wrappers όλα λένε στο SwiftUI και . Ο βασικός διαχωρισμός είναι (, ) έναντι (, , ), συν το ποιος είναι υπεύθυνος για τη διάρκεια ζωής του αντικειμένου.
@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 | Τύπος | Ιδιοκτησία | Χρήση όταν |
|---|---|---|---|
@State | value | αυτό το view | απλή τοπική κατάσταση |
@Binding | value | ένας γονέας | το παιδί επεξεργάζεται την κατάσταση του γονέα |
@StateObject | reference | αυτό το view (δημιουργείται μία φορά) | το view δημιουργεί το model |
@ObservedObject | reference | αλλού | το model περνιέται ως όρισμα |
@EnvironmentObject | reference | πρόγονος | κοινό βαθιά μέσα στο δέντρο |
@StateObject έναντι @ObservedObject είναι η κλασική παγίδα. Η δημιουργία ενός model με @ObservedObject var m = Model() το ξαναδημιουργεί σε κάθε re-render, χάνοντας σιωπηλά την κατάσταση. Χρησιμοποιήστε @StateObject όπου το view δημιουργεί το αντικείμενο.@EnvironmentObject προκαλεί crash κατά το runtime αν κανένας πρόγονος δεν το εισήγαγε μέσω .environmentObject(...).Η επιλογή λάθος wrapper είναι η νούμερο ένα πηγή bugs κατάστασης στο SwiftUI — τιμές που τρεμοπαίζουν, resets κατά το scroll, ή views που δεν ενημερώνονται ποτέ. Οι συνεντευξιαστές το ρωτούν επειδή η απάντηση για το @StateObject έναντι @ObservedObject αποκαλύπτει άμεσα αν κατανοείτε το μοντέλο ιδιοκτησίας του SwiftUI.
Μια βιβλιοθήκη ερωτήσεων συνέντευξης IT με αναλυτικές απαντήσεις — από Junior έως Senior.
Δωρεά