تخبر مغلِّفات الخصائص (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)") }
}
| المغلِّف | النوع | الملكية | يُستخدم متى |
|---|---|---|---|
@State | قيمة | هذا العرض | حالة محلية بسيطة |
@Binding | قيمة | عرض أب | الابن يعدّل حالة الأب |
@StateObject | مرجع | هذا العرض (يُنشأ مرة) | العرض ينشئ النموذج |
@ObservedObject | مرجع | مكان آخر | النموذج مُمرَّر إليه |
@EnvironmentObject | مرجع | سلف (ancestor) | مشترك في عمق الشجرة |
@StateObject مقابل @ObservedObject هو الفخ الكلاسيكي. فإنشاء نموذج بـ @ObservedObject var m = Model() يعيد إنشاءه عند كل إعادة عرض، فاقدًا الحالة بصمت. استخدم @StateObject أينما ينشئ العرض الكائن.@EnvironmentObject ينهار وقت التشغيل إذا لم يحقنه أي سلف عبر .environmentObject(...).اختيار المغلِّف الخاطئ هو المصدر الأول لأخطاء الحالة في SwiftUI — قيم تومض، وإعادة تعيين عند التمرير، أو عروض لا تتحدث أبدًا. يسأل القائمون على المقابلات عن هذا لأن الإجابة عن @StateObject مقابل @ObservedObject تكشف فورًا ما إذا كنت تفهم نموذج الملكية في SwiftUI.
مكتبة من أسئلة مقابلات تقنية المعلومات مع إجابات مفصّلة — من المبتدئ إلى المتقدم.
تبرع