الامتثال المشروط
اجعل نوعًا عامًا يمتثل لـProtocol فقط إذا استوفى معامل نوعه القيود، مثل Box<T>: Equatable where T: Equatable .
الامتثال المشروط درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 1 من أصل 3. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 3 دروس في المجموع.
لماذا التوافق المشروط؟
يضيف التوافق المشروط توافقًا مع بروتوكول فقط عندما تستوفي معلمات النوع قيودًا محددة. يحافظ ذلك على دقة واجهات برمجة التطبيقات، ويتجنب التعليمات البرمجية المتكررة، ويتكامل بقوة مع المكتبة القياسية.
الأساسيات العامة للنوع
ابدؤوا بنوع عام. من دون عمل إضافي، لا يتوافق Box مع Equatable/Hashable حتى إذا كان T متوافقًا معهما.
struct Box<T> {
var value: T
}
let bi = Box(value: 3)
let bs = Box(value: "hi")
// At this point Box has no Equatable/Hashable, regardless of T.التوافق الشرطي مع Equatable
أضيفوا Equatable فقط إذا كان T: Equatable. لن تُترجم التعليمات البرمجية التي تقارن صناديق من أنواع غير متوافقة مع Equatable، وهو ما يوفر أمانًا جيدًا.
extension Box: Equatable where T: Equatable {
static func == (lhs: Box<T>, rhs: Box<T>) -> Bool {
lhs.value == rhs.value
}
}
print(Box(value: 5) == Box(value: 5)) // true
// Works because Int is Equatable
// print(Box(value: someNonEquatable) == ...) // won't compileالتوافق الشرطي مع Hashable
وبالمثل، اعتمدوا Hashable فقط عندما يكون العنصر متوافقًا مع Hashable. عندها يعمل Set/Dictionary مع Box<T>.
extension Box: Hashable where T: Hashable {
func hash(into hasher: inout Hasher) {
hasher.combine(value)
}
}
let set: Set<Box<Int>> = [Box(value: 1), Box(value: 1)]
print(set.count) // 1 because Hashable is available only when T: Hashableتقييد الميزات باستخدام where
استخدموا extension ... where لإتاحة الأساليب لقدرات معينة فقط، مثل T: Numeric، مع إبقاء واجهة برمجة التطبيقات الأساسية صغيرة.
// Add extra APIs only when T supports them
extension Box where T: Numeric {
func doubled() -> T { value + value }
}
print(Box(value: 7).doubled()) // 14 (Int is Numeric)
// Box(value: "hi").doubled() // won't compile — String not Numericكما يظهر في المكتبة القياسية
أنتم تستخدمون هذا يوميًا بالفعل:
- Array: Equatable لا يتوفر إلا عندما يكون
Element: Equatable. - تجزئة Dictionary/Set لا تتوفر إلا عندما تكون المفاتيح أو العناصر
Hashable. - مساواة Optional لا تتوفر إلا عندما يكون
Wrapped: Equatable.
الفائدة: واجهات برمجة تطبيقات دقيقة وآمنة أثناء الترجمة.
تحقق من التعريف
تحقق سريع: ماذا يتيح التوافق المشروط؟
الخلاصة
الخلاصة: استخدموا extension Type: Protocol where ... لإضافة التوافقات وواجهات برمجة التطبيقات فقط عند استيفاء القيود. يحافظ ذلك على دقة التعليمات البرمجية وسلامتها وسهولة فهمها.
الأسئلة الشائعة
هل درس «الامتثال المشروط» مجاني؟
نعم — نص درس «الامتثال المشروط» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 3 دروس في المجموع.
ماذا ستتعلم في «الامتثال المشروط»؟
اجعل نوعًا عامًا يمتثل لـProtocol فقط إذا استوفى معامل نوعه القيود، مثل Box<T>: Equatable where T: Equatable . تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟
لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 3.
كم من الوقت يستغرق درس «الامتثال المشروط»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟
نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.