property wrapper เหล่านี้ล้วนบอก SwiftUI ว่า และ จุดแบ่งสำคัญคือระหว่าง (, ) กับ (, , ) รวมถึงว่าใครเป็นผู้รับผิดชอบต่อ lifetime ของ object นั้น
@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 นี้ | state ในตัวแบบง่าย ๆ |
@Binding | value | parent | ลูกแก้ไข state ของ parent |
@StateObject | reference | view นี้ (สร้างครั้งเดียว) | view เป็นผู้สร้าง model |
@ObservedObject | reference | ที่อื่น | model ถูกส่งเข้ามา |
@EnvironmentObject | reference | ancestor | แชร์กันลึกลงไปในต้นไม้ |
@StateObject เทียบกับ @ObservedObject คือกับดักคลาสสิก การสร้าง model ด้วย @ObservedObject var m = Model() จะสร้าง instance ใหม่ทุกครั้งที่ re-render ทำให้ state หายไปแบบเงียบ ๆ ให้ใช้ @StateObject ทุกที่ที่ view เป็นผู้ สร้าง object นั้น@EnvironmentObject จะ crash ตอน runtime ถ้าไม่มี ancestor ตัวใดฉีดมันเข้ามาผ่าน .environmentObject(...)การเลือก wrapper ผิดคือสาเหตุอันดับหนึ่งของบั๊ก state ใน SwiftUI — ค่ากะพริบ, ถูกรีเซ็ตเมื่อ scroll, หรือ view ที่ไม่เคยอัปเดต ผู้สัมภาษณ์ถามเรื่องนี้เพราะคำตอบระหว่าง @StateObject กับ @ObservedObject เผยทันทีว่าคุณเข้าใจโมเดลความเป็นเจ้าของของ SwiftUI หรือไม่
คลังคำถามสัมภาษณ์งาน IT พร้อมคำตอบโดยละเอียด — ตั้งแต่ระดับ Junior ถึง Senior
บริจาค