Protocol في Swift — ما هو، بناء الجملة والإمكانيات

المؤلف: IT Sectr نُشر: 2026-06-17 وقت القراءة: 6 دق

Protocol في Swift هو عقد يحدد مجموعة من المتطلبات التي يجب أن يفي بها أي نوع يتبناه. تشكل البروتوكولات أساس البرمجة الموجهة بالبروتوكولات (POP) — وهي نموذج أوصت به Apple لـ Swift إلى جانب OOP التقليدية. وفقاً لـ Apple Documentation, 2026، يمكن للهياكل والفئات والتعدادات تبنّي البروتوكولات، مما يجعل البنية مرنة وقابلة للاختبار.

أهم النقاط

  • Protocol — عقد بمتطلبات للهياكل والفئات والتعدادات
  • المتطلبات تشمل الدوال، الخصائص، المبدئات والمؤشرات الفرعية
  • Protocol Composition يتيح دمج بروتوكولات متعددة
  • POP — البرمجة الموجهة بالبروتوكولات، بديل للوراثة
  • Protocol Extensions تضيف تطبيقات افتراضية للدوال

ما هو Protocol في Swift؟

Protocol هو واجهة مجردة تحدد ما يجب أن يكون النوع قادراً على فعله، ولكن ليس كيف يفعله. في Swift، البروتوكول مشابه للواجهات في Java أو Go، لكن مع إمكانيات إضافية.

يمكن للبروتوكول أن يطلب:

  • دوال للكائن وللنوع (ثابتة)
  • خصائص مع محددات { get } أو { get set }
  • مبدئات
  • مؤشرات فرعية
  • أنواع مرتبطة (عامة على مستوى البروتوكول)

وفقاً لـ WWDC 2015، قدمت Apple البرمجة الموجهة بالبروتوكولات كنهج أساسي لهندسة تطبيقات Swift. على عكس OOP حيث تخلق وراثة الفئات تسلسلات هرمية صلبة، تقدم POP تركيب البروتوكولات. وهذا يوفر مرونة: يمكن لنوع واحد أن يتوافق مع بروتوكولات متعددة، ويحصل على متطلباتها وتطبيقاتها من خلال الامتدادات.

بناء جملة تعريف البروتوكولات

Protocol يُعرّف بالكلمة المفتاحية protocol واسم وجسم.

swift
protocol Drawable {
    func draw(context: CGContext)
    var boundingBox: CGRect { get }
}

يتبنى النوع بروتوكولاً باستخدام نقطتين بعد اسمه:

swift
struct Circle: Drawable {
    let center: CGPoint
    let radius: CGFloat

    func draw(context: CGContext) {
        context.addArc(center: center, radius: radius, ...)
    }

    var boundingBox: CGRect {
        CGRect(x: center.x - radius, y: center.y - radius,
               width: radius * 2, height: radius * 2)
    }
}

يمكن لنوع واحد أن يتبنى بروتوكولات متعددة مفصولة بفواصل: struct MyType: ProtocolA, ProtocolB. يتحقق المترجم من استيفاء جميع متطلبات كل بروتوكول.

متطلبات الخصائص والدوال

متطلبات الخصائص تُعلن بالكلمة المفتاحية var ومحددات الوصول { get } أو { get set }.

swift
protocol UserProtocol {
    var name: String { get }
    var age: Int { get set }
    static var maxAge: Int { get }
    mutating func updateName(_ newName: String)
}

الكلمة المفتاحية mutating في البروتوكول تعني أن الدالة يمكنها تعديل self. يجب على الهياكل تنفيذ هذه الدالة بصفتها mutating، بينما يمكن للفئات حذفها. متطلبات الدوال تُعلن بتوقيع كامل يشمل تسميات المعاملات.

توريث البروتوكولات

Protocol يمكنه توريث بروتوكول آخر، مضيفاً متطلبات جديدة. وهذا يخلق تسلسلاً هرمياً من العقود دون ارتباط صارم بالفئات.

swift
protocol Vehicle {
    var speed: Double { get set }
    func move()
}

protocol Flyable: Vehicle {
    var altitude: Double { get set }
    func takeOff()
}

النوع الذي يتبنى Flyable يجب أن يفي بمتطلبات كلا البروتوكولين — Vehicle و Flyable. Swift يدعم التوريث المتعدد للبروتوكولات: protocol A: B, C.

Protocol Composition

Protocol Composition هي آلية تتيح تحديد أن نوعاً ما يجب أن يتوافق مع بروتوكولات متعددة في وقت واحد، دون إنشاء بروتوكول جديد مُركّب.

swift
func render(_ item: Drawable & Animatable) {
    item.draw(context: ...)
    item.animate(duration: 0.3)
}

التركيب (&) يعمل في معاملات الدوال والمتغيرات والقيود العامة. يتحقق المترجم من أن النوع المُمرر في وقت واحد يلبي جميع البروتوكولات. يُستخدم التركيب على نطاق واسع في SwiftUI: some View هو نوع عام مع تركيب.

Protocol Composition أفضل من إنشاء تسلسل هرمي للوراثة: بدلاً من protocol A: B, C يمكن تبنّي B & C مباشرة. وهذا يوفر مرونة ويقلل الاقتران. التركيب مفيد بشكل خاص في معاملات الدوال والقيود العامة حيث تحتاج إلى دمج المتطلبات مؤقتاً دون إنشاء بروتوكول وسيط. وهذا يقلل عدد الأنواع المساعدة في الكود.

البروتوكول كنوع

Protocol يمكن استخدامه كنوع لمتغير أو معامل دالة أو عنصر مجموعة. وهذا يُسمى النمط الوجودي.

swift
var drawableItem: Drawable
let items: [Drawable] = [Circle(...), Rectangle(...)]

func process(drawables: [any Drawable]) {
    for item in drawables {
        item.draw(context: ...)
    }
}

الكلمة المفتاحية any (Swift 5.6+) تُحدد صراحة النمط الوجودي. بدون any، يُصدر المترجم تحذيراً. Swift يدعم أيضاً some (الأنواع غير الشفافة) لإخفاء النوع الملموس خلف بروتوكول — وهذا نهج قياسي في SwiftUI.

الأخطاء الشائعة مع البروتوكولات

عند العمل مع البروتوكولات، يرتكب المطورون غالباً عدة أخطاء متكررة.

  • نسيان mutating — دالة مُعلَمة كـ mutating في البروتوكول، لكن الهيكل ينفذها بدون الكلمة المفتاحية
  • البروتوكول كنوع بدلاً من النوع العام — استخدام Drawable بدلاً من <T: Drawable> حيث نحتاج نوعاً ملموساً
  • مرجع بروتوكول دائري — بروتوكول يشير إلى نفسه من خلال نوع مرتبط بدون حل صحيح
  • بروتوكول للفئات فقط — استخدام AnyObject دون داعٍ مما يستثني الهياكل والتعدادات

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

ما الفرق بين protocol و abstract class؟

Protocol يُحدد فقط المتطلبات دون تطبيق (حتى ظهور protocol extensions). الـ abstract class يمكن أن يحتوي على تطبيق وحالة. لا توجد فئات مجردة في Swift — دورها تؤديه البروتوكولات مع الامتدادات.

هل يمكن للـ struct تبنّي protocol؟

نعم، الهياكل والفئات والتعدادات — جميعها يمكنها تبنّي البروتوكولات. هذا أساس POP: لست مضطراً لاستخدام الفئات لتنظيم البنية. الهياكل مع البروتوكولات توفر دلالات القيم والثبات.

ما هو associated type في البروتوكول؟

Associated type (associatedtype) هو عنصر نائب لنوع يحدده النوع المنفذ بنفسه. مثال: Collection لديه associatedtype Element. هذا نوع عام على مستوى البروتوكول.

هل يمكنني تقييد البروتوكول للفئات فقط؟

نعم، أضف وراثة من AnyObject: protocol MyProtocol: AnyObject. عندها فقط الفئات ستتمكن من تبنّي هذا البروتوكول. هذا مفيد للمراجع الضعيفة والمفوّضين.

كيف أتحقق من التوافق مع بروتوكول في وقت التشغيل؟

استخدم is للتحقق و as? للتحويل: if let drawable = item as? Drawable. هذا يعمل فقط مع البروتوكولات التي ليس لها أنواع مرتبطة.

الخلاصة

  • Protocol — عقد للدوال والخصائص والمبدئات والمؤشرات الفرعية
  • Class, struct, enum — جميع الأنواع يمكنها تبنّي البروتوكولات
  • الوراثة للبروتوكولات تخلق تسلسلاً هرمياً للعقود دون ارتباط صارم
  • Protocol Composition (&) يجمع البروتوكولات دون وراثة
  • الأنواع الوجودية (any) و الأنواع غير الشفافة (some) — طريقتان للعمل مع البروتوكولات
  • POP موصى به من Apple كبديل لوراثة الفئات التقليدية
  • Protocol Extensions تتيح إضافة تطبيقات افتراضية

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا