0Pricing
Swift Academy · درس

any P (وجودي): المفاضلات والإرسال الديناميكي

استخدم any P لتخزين أو تمرير الأنواع غير المتجانسة المتوافقة خلف بروتوكول. تعرّف إلى الإرسال الديناميكي والتغليف والقيود المتعلقة بمتطلبات associated types / Self .

any P (وجودي): المفاضلات والإرسال الديناميكي درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 2 من أصل 3. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 3 دروس في المجموع.

ما النوع الوجودي؟

الأنواع الوجودية (any P) تحتوي أي قيمة متوافقة مع P. وهي تتيح تخزين قيم غير متجانسة والإرسال الديناميكي، مع بعض القيود.

  • مناسبة جدًا للمجموعات المختلطة
  • إرسال ديناميكي عبر جداول شهود البروتوكول
  • قيود مع الأنواع المرتبطة وSelf

مجموعة غير متجانسة

تتيح لك any Shape تخزين أنواع مختلفة متوافقة مع البروتوكول معًا، واستدعاء طرق البروتوكول عبر الإرسال الديناميكي.

protocol Shape { func area() -> Double }

struct Circle: Shape { let r: Double; func area() -> Double { .pi * r * r } }
struct Square: Shape { let s: Double; func area() -> Double { s * s } }

// Heterogeneous array using ANY Shape
let shapes: [any Shape] = [Circle(r: 1), Square(s: 2), Circle(r: 0.5)]
let total = shapes.reduce(0) { $0 + $1.area() }   // dynamic dispatch
print(String(format: "%.2f", total))

حد الواجهة

لا تكشف الأنواع الوجودية سوى واجهة البروتوكول. وتتطلب الطرق الخاصة بالنوع الملموس التحويل إلى نوع أدق (وهو اختياري ويُتحقق منه وقت التشغيل).

extension Circle { func diameter() -> Double { 2 * r } }

let mixed: [any Shape] = [Circle(r: 1), Square(s: 3)]
print(mixed[0].area())            // OK: in protocol
// print(mixed[0].diameter())     // ❌ Not visible via any Shape (commented)
// You'd need a type check / downcast:
if let c = mixed[0] as? Circle { print(c.diameter()) }

تنبيه بشأن النوع المرتبط

لا تستطيع الأنواع الوجودية حمل الأنواع المرتبطة غير المعروفة أو المتطلبات المرتبطة بـ Self مباشرةً. استخدم محو النوع أو ثبّت النوع المرتبط عبر غلاف.

// Protocols with associated types/Self constraints can be hard to use as existentials.
protocol Parser {
    associatedtype Output
    func parse(_ s: String) -> Output
}

// let p: any Parser = ...     // ❌ Not directly usable: Output is unknown
// Workarounds: type erasure or constrain Output to a specific type in wrappers.

اختيار أسلوب المعامل

النوع الوجودي: غير متجانس ومرن. النوع العام: متجانس وأسرع، ويُتحقق منه وقت الترجمة. اختر ما يناسب الحاجة.

// Existential: accepts any mix of Shapes (dynamic dispatch)
func totalAreaExistential(_ xs: [any Shape]) -> Double {
    xs.reduce(0) { $0 + $1.area() }
}

// Generic (homogeneous): static dispatch; one concrete Shape type per call
func totalAreaGeneric<S: Sequence, T: Shape>(_ xs: S) -> Double
where S.Element == T {
    xs.reduce(0) { $0 + $1.area() }
}

print(totalAreaExistential([Circle(r:1), Square(s:2)]))  // mixed OK
print(totalAreaGeneric([Circle(r:1), Circle(r:2)]))      // homogeneous only
// totalAreaGeneric([Circle(r:1), Square(s:2)])          // ❌ different types

متى تستخدم any P

إرشادات:

  • استخدم any P للتخزين غير المتجانس وتعدد الأشكال وقت التشغيل.
  • فضّل الأنواع العامة للأداء والضمانات الثابتة عندما تكون العناصر متجانسة.
  • تجنّب الأنواع الوجودية للبروتوكولات التي تحتوي على أنواع مرتبطة أو Self، ما لم تمحُ النوع أو تستخدم غلافًا.

فائدة النوع الوجودي

تحقّق سريعًا: ماذا يتيح any P؟

خلاصة

خلاصة: any P = حاوية وجودية للقيم المتوافقة مع البروتوكول. وهي تتيح تعدد الأشكال غير المتجانس عبر الإرسال الديناميكي، لكنها تخفي واجهات API الخاصة بالنوع الملموس وتواجه صعوبة مع الأنواع المرتبطة وSelf.

الأسئلة الشائعة

هل درس «any P (وجودي): المفاضلات والإرسال الديناميكي» مجاني؟

نعم — نص درس «any P (وجودي): المفاضلات والإرسال الديناميكي» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 3 دروس في المجموع.

ماذا ستتعلم في «any P (وجودي): المفاضلات والإرسال الديناميكي»؟

استخدم any P لتخزين أو تمرير الأنواع غير المتجانسة المتوافقة خلف بروتوكول. تعرّف إلى الإرسال الديناميكي والتغليف والقيود المتعلقة بمتطلبات associated types / Self . تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟

لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 3.

كم من الوقت يستغرق درس «any P (وجودي): المفاضلات والإرسال الديناميكي»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟

نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. some P (أنواع النتائج غير الشفافة): إخفاء الأنواع الملموسة
  2. any P (وجودي): المفاضلات والإرسال الديناميكي
  3. الاختيار بين some وany والأنواع العامة
← العودة إلى Swift Academy