0Pricing
Swift Academy · درس

امتدادات Protocol مقابل امتدادات النوع

قارن بين امتدادات Protocol التي تضيف تطبيقات افتراضية إلى Protocol، حتى بشكل مشروط، وامتدادات النوع التي تضيف واجهات API إلى نوع ملموس واحد. وافهم سلوك الإرسال والقيود.

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

نظرة عامة

الهدف: معرفة متى نستخدم امتداد البروتوكول، الذي يوفر سلوكًا افتراضيًا لجميع الأنواع المتوافقة، مقابل امتداد النوع، الذي يضيف واجهات برمجية لنوع ملموس واحد. وسنوضح أيضًا قواعد الإرسال.

البروتوكول والتوافق

تعلن البروتوكولات عن المتطلبات. وتصبح الأنواع متوافقة من خلال تنفيذ تلك المتطلبات.

protocol Greeter {
    func greet() -> String
}
struct Person: Greeter {
    var name: String
    func greet() -> String { "Hi, I'm \\(name)" }  // concrete requirement impl
}
print(Person(name: "Ada").greet())

التنفيذات الافتراضية عبر امتداد البروتوكول

يمكن لـامتداد البروتوكول توفير تنفيذات افتراضية تستخدمها جميع الأنواع المتوافقة، ما لم توفر تنفيذاتها الخاصة.

protocol Describable {
    func describe() -> String
}
extension Describable {
    // default for ALL conformers until they override
    func describe() -> String { "No description" }
}

struct Car: Describable { }             // uses default
struct Book: Describable {
    func describe() -> String { "A book" } // custom override
}
print(Car().describe(), Book().describe())

واجهات برمجية عبر امتداد النوع

تضيف امتدادات النوع أساليب وخصائص محسوبة إلى نوع ملموس واحد. لكنها لا تضيف خصائص مخزنة.

struct Point { var x: Int; var y: Int }

extension Point {
    // add helper just to Point
    var lengthSquared: Int { x*x + y*y }
    func moved(dx: Int, dy: Int) -> Point { Point(x: x+dx, y: y+dy) }
}
let p = Point(x: 2, y: 3)
print(p.lengthSquared, p.moved(dx: 1, dy: -1))

الامتدادات الشرطية

أضف سلوكًا إلى بعض الأنواع المتوافقة باستخدام عبارة where في امتداد البروتوكول.

protocol Summable { }
extension Int: Summable { }
extension Array where Element: Summable {
    // only for arrays whose elements conform to Summable
    func joinedCount() -> Int { self.count }
}
print([1,2,3].joinedCount())   // works (Int conforms)
 // print(["a","b"].joinedCount()) // not available

سلوك الإرسال (نظرة عامة)

قاعدة عامة: إذا كانت إحدى الطرق متطلبًا في البروتوكول وطبّقها نوع متوافق، فسيُعتمد تنفيذ ذلك النوع، بإرسال شبيه بالديناميكي. أما الطرق المضافة في امتداد البروتوكول فقط، وليست متطلبات، فيُجرى إرسالها بصورة ثابتة.

protocol Speaker { func speak() -> String }
extension Speaker { func speak() -> String { "default" } }

struct Cat: Speaker { }
struct Dog: Speaker {
    func speak() -> String { "woof" } // requirement impl overrides default
}

let s1: Speaker = Cat()
let s2: Speaker = Dog()
print(s1.speak()) // "default" (uses default impl)
print(s2.speak()) // "woof" (Dog provides requirement impl)

let c = Cat()
print(c.speak())  // "default" via extension on protocol

امتداد البروتوكول مقابل امتداد النوع

تحقق سريع: ما الفرق الأساسي؟

مراجعة

مراجعة: استخدم امتدادات البروتوكول للتنفيذات الافتراضية القابلة لإعادة الاستخدام، ويمكن جعلها مشروطة. واستخدم امتدادات النوع لتوسيع نوع واحد. وتذكّر قاعدة الإرسال: تتغلب تطبيقات المتطلبات على طرق الامتداد الافتراضية.

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

هل درس «امتدادات Protocol مقابل امتدادات النوع» مجاني؟

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

ماذا ستتعلم في «امتدادات Protocol مقابل امتدادات النوع»؟

قارن بين امتدادات Protocol التي تضيف تطبيقات افتراضية إلى Protocol، حتى بشكل مشروط، وامتدادات النوع التي تضيف واجهات API إلى نوع ملموس واحد. وافهم سلوك الإرسال والقيود. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

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

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

كم من الوقت يستغرق درس «امتدادات Protocol مقابل امتدادات النوع»؟

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

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

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

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

  1. أساسيات Protocols وExtensions
  2. امتدادات Protocol مقابل امتدادات النوع
  3. متطلبات النوع مقابل متطلبات النسخة
← العودة إلى Swift Academy