Kesemua property wrapper ini memberitahu SwiftUI dan . Pembahagian utama ialah (, ) berbanding (, , ), serta siapa yang bertanggungjawab ke atas jangka hayat objek.
@State@Binding@StateObject@ObservedObject@EnvironmentObject// Value state DIMILIKI oleh view ini
struct Toggle: View {
@State private var isOn = false // sumber kebenaran tempatan
var body: some View {
Switch(isOn: $isOn) // $ mencipta Binding
}
}
// Rujukan dua-hala kepada state yang dimiliki DI TEMPAT LAIN
struct Switch: View {
@Binding var isOn: Bool // tiada pemilikan; baca+tulis parent
var body: some View { Button("\(isOn)") { isOn.toggle() } }
}
final class CartModel: ObservableObject {
@Published var items: [Item] = [] // perubahan => view render semula
}
struct CartScreen: View {
@StateObject private var model = CartModel() // MEMILIKI: dicipta sekali, terus wujud merentas render-semula
var body: some View { CartList(model: model) }
}
struct CartList: View {
@ObservedObject var model: CartModel // memerhati; dimiliki oleh parent
var body: some View { Text("\(model.items.count)") }
}
| Wrapper | Jenis | Pemilikan | Guna apabila |
|---|---|---|---|
@State | value | view ini | state tempatan mudah |
@Binding | value | sesuatu parent | anak mengedit state parent |
@StateObject | reference | view ini (dicipta sekali) | view mencipta model |
@ObservedObject | reference | di tempat lain | model dihantar masuk |
@EnvironmentObject | reference | leluhur (ancestor) | dikongsi jauh di dalam pokok |
@StateObject vs @ObservedObject ialah perangkap klasik. Mencipta model dengan @ObservedObject var m = Model() menginstansiasi semula ia pada setiap render-semula, secara senyap kehilangan state. Gunakan @StateObject di mana-mana sahaja view mencipta objek.@EnvironmentObject ranap semasa run-time jika tiada leluhur menyuntiknya melalui .environmentObject(...).Memilih wrapper yang salah ialah punca nombor-satu pepijat state SwiftUI — nilai berkelip, reset semasa scroll, atau view yang tidak pernah dikemas kini. Penemu duga bertanya ini kerana jawapan @StateObject vs @ObservedObject serta-merta mendedahkan sama ada anda memahami model pemilikan SwiftUI.
Pustaka soalan temu duga IT dengan jawapan terperinci — daripada Junior hingga Senior.
Derma