العروض القابلة للمقارنة ونطاق @State
ضيّق نطاق الحالة للحد من إبطال الصلاحية.
العروض القابلة للمقارنة ونطاق @State درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 4 دروس في المجموع.
يمكن للمساواة تخطّي المعالجة
إذا تمكّنت SwiftUI من إثبات أن مدخلات العرض لم تتغير، يمكنها تخطّي إعادة تصييره. ويمنح جعل العرض Equatable SwiftUI طريقة دقيقة لاتخاذ هذا القرار.
الالتزام بـ Equatable
اجعلوا عرضكم ملتزمًا بـ Equatable، وستقارن SwiftUI بين القيم القديمة والجديدة. فإذا كانت متساوية، تتخطّى تقييم body.
struct Badge: View, Equatable {
let count: Int
var body: some View { Text("\(count)") }
static func == (a: Badge, b: Badge) -> Bool {
a.count == b.count
}
}EquatableView
يمكنكم أيضًا تغليف أي عرض قابل للمقارنة باستخدام .equatable() لطلب التخطي القائم على المقارنة، من دون تغيير مواضع استدعاء النوع في كل مكان.
Badge(count: total)
.equatable()متى يكون Equatable مفيدًا
يكون Equatable مفيدًا جدًا للعروض ذات المدخلات منخفضة التكلفة عند مقارنتها، لكن أجسامها مرتفعة التكلفة. ولكي تحقق المقارنة فائدة، يجب أن تكون تكلفتها أقل بكثير من تكلفة التصيير.
فخ تكلفة المقارنة
إذا كانت == نفسها مرتفعة التكلفة، مثل المقارنة العميقة لمصفوفات كبيرة، فقد تكلف أكثر من عملية التصيير التي تحاولون تخطّيها. قارنوا الحقول الرخيصة والحاسمة فقط.
static func == (a: Self, b: Self) -> Bool {
a.id == b.id && a.version == b.version // cheap fields
}Equatable المُولّد تلقائيًا
إذا كانت جميع الخصائص المخزنة قابلة للمقارنة، يمكن لـ Swift توليد == تلقائيًا. لكن عمليات الإغلاق وبعض الأنواع ليست قابلة للمقارنة، لذلك قد تحتاجون إلى تنفيذ مخصص يتجاهلها.
struct Card: View, Equatable {
let title: String
let onTap: () -> Void // not Equatable
static func == (a: Card, b: Card) -> Bool { a.title == b.title }
var body: some View { Text(title) }
}تضييق نطاق @State
تؤدي الحالة الموضوعة في مستوى عالٍ جدًا إلى إعادة تصيير كل ما يقع تحتها. انقلوا @State إلى أصغر عرض يملكها، بحيث تؤثر التغييرات في أقل قدر ممكن من واجهة المستخدم.
// Move toggle state into the row that uses it
struct Row: View {
@State private var expanded = false
var body: some View { /* only this row re-renders */ Text("Row") }
}رفع الحالة عند الحاجة إلى مشاركتها فقط
ارفعوا الحالة إلى مستوى أعلى فقط عندما تحتاج إليها عدة عروض فعلًا. أما في الحالات الأخرى، فتحافظ الحالة المحلية على صِغر نطاق إعادة التصيير.
استخراج العروض الفرعية لعزل التحديثات
يؤدي استخراج الجزء الذي يتغير كثيرًا إلى عرض مستقل إلى حصر إعادة التقييم في ذلك العرض، مع إبقاء العروض الشقيقة دون تغيير.
struct LiveClock: View {
@State private var now = Date()
var body: some View { Text(now, style: .time) }
}الروابط والنطاق
يربط @Binding العرض الابن بحالة العرض الأب. ويؤدي تمرير رابط ضيق، أي حقل واحد، بدلًا من الكائن بأكمله إلى الحد من التغييرات التي تنتشر.
struct NameField: View {
@Binding var name: String // narrow binding
var body: some View { TextField("Name", text: $name) }
}اجمعوا بين Equatable والنطاق
تأتي أفضل النتائج من الجمع بين الأساليب: تضييق موضع الحالة لتقليل المحفزات، مع استخدام Equatable لتخطّي عمليات التصيير التي لا تزال تحدث.
تحقق سريع: عروض Equatable
اختبروا فهمكم لعروض Equatable ونطاق الحالة.
مراجعة: عروض Equatable ونطاق الحالة
يتيح جعل العرض Equatable، أو استخدام .equatable()، لـ SwiftUI تخطّي عمليات التصيير التي لم تتغير، ويكون ذلك مفيدًا عندما تكون المقارنة أقل تكلفة بكثير من التصيير، مع استخدام الحقول الحاسمة فقط.
ضيّقوا نطاق @State إلى أصغر عرض يملكها، ومرّروا روابط ضيقة، واستخرجوا الأجزاء المتقلبة إلى عروض مستقلة. ويؤدي الجمع بين نطاق الحالة الضيق وEquatable إلى أقل عدد ممكن من عمليات إعادة التصيير وأدناها تكلفة.
الأسئلة الشائعة
هل درس «العروض القابلة للمقارنة ونطاق @State» مجاني؟
نعم — نص درس «العروض القابلة للمقارنة ونطاق @State» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.
ماذا ستتعلم في «العروض القابلة للمقارنة ونطاق @State»؟
ضيّق نطاق الحالة للحد من إبطال الصلاحية. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟
لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «العروض القابلة للمقارنة ونطاق @State»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟
نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- فهم هوية العرض
- تقليل إعادة تقييم Body
- العروض القابلة للمقارنة ونطاق @State
- تحليل الأداء باستخدام أداة SwiftUI