0Pricing
Swift Academy · درس

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

اجمع متطلبات بروتوكولات متعددة باستخدام &.

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

دمج البروتوكولات

أحيانًا يجب أن تستوفي قيمة عدة بروتوكولات في الوقت نفسه. تتيح لك Swift تركيب البروتوكولات باستخدام العامل &: SomeProtocol & AnotherProtocol.

protocol Named { var name: String { get } }
protocol Aged { var age: Int { get } }

معامل مركَّب

يقبل المعامل من النوع Named & Aged أي قيمة متوافقة مع كلا البروتوكولين.

protocol Named { var name: String { get } }
protocol Aged { var age: Int { get } }

struct Person: Named, Aged {
    let name: String
    let age: Int
}

func intro(_ x: Named & Aged) {
    print(x.name + " is " + String(x.age))
}
intro(Person(name: "Sam", age: 28))

لماذا لا نستخدم الوراثة؟

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

protocol Drawable { func draw() -> String }
protocol Resizable { func resize(_ f: Double) -> String }

struct Icon: Drawable, Resizable {
    func draw() -> String { "drawing" }
    func resize(_ f: Double) -> String { "x" + String(f) }
}

func render(_ v: Drawable & Resizable) {
    print(v.draw(), v.resize(2))
}
render(Icon())

ثلاثة بروتوكولات أو أكثر

يمكنك ربط أي عدد تحتاج إليه من البروتوكولات باستخدام عوامل & إضافية.

protocol A { func a() -> String }
protocol B { func b() -> String }
protocol C { func c() -> String }

struct X: A, B, C {
    func a() -> String { "a" }
    func b() -> String { "b" }
    func c() -> String { "c" }
}

func use(_ v: A & B & C) { print(v.a(), v.b(), v.c()) }
use(X())

التركيب مع فئة

يمكنك دمج نوع فئة مع بروتوكولات: يتطلب SomeClass & SomeProtocol أن تكون القيمة من تلك الفئة أو من فئة فرعية منها، وأن تكون متوافقة مع البروتوكول أيضًا.

class Vehicle { var speed = 0 }
protocol Electric { var battery: Int { get } }

class Tesla: Vehicle, Electric { var battery = 100 }

func check(_ v: Vehicle & Electric) {
    print(v.speed, v.battery)
}
check(Tesla())

إعادة تركيب

يمكن للدالة إعادة نوع مركَّب، متعهدةً للمستدعي بأن النتيجة متوافقة مع جميع البروتوكولات المدرجة.

protocol Named { var name: String { get } }
protocol Aged { var age: Int { get } }
struct Person: Named, Aged { let name: String; let age: Int }

func makePerson() -> Named & Aged {
    Person(name: "Eve", age: 22)
}
let p = makePerson()
print(p.name, p.age)

typealias للتركيب

امنح التركيب اسمًا واضحًا باستخدام typealias حتى تتمكن من إعادة استخدامه دون تكرار سلسلة عوامل &.

protocol Codable2 { func encode() -> String }
protocol Loggable { func log() -> String }

typealias Persistable = Codable2 & Loggable

struct Record: Persistable {
    func encode() -> String { "data" }
    func log() -> String { "logged" }
}
func save(_ r: Persistable) { print(r.encode(), r.log()) }
save(Record())

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

يمكنك تخزين قيم من النوع المركَّب في المصفوفات، والوصول إلى أعضاء جميع البروتوكولات في كل عنصر.

protocol Named { var name: String { get } }
protocol Aged { var age: Int { get } }
struct P: Named, Aged { let name: String; let age: Int }

let group: [Named & Aged] = [P(name: "A", age: 1), P(name: "B", age: 2)]
for g in group { print(g.name, g.age) }

التركيب مع البروتوكولات القياسية

يبرز التركيب عند استخدام بروتوكولات المكتبة. فعلى سبيل المثال، يمكنك طلب التوافق مع كل من CustomStringConvertible وEquatable.

func report<T>(_ items: [T]) where T: CustomStringConvertible & Equatable {
    for i in items { print(i.description) }
}
report([1, 2, 3])

البروتوكولات الفارغة كعلامات

يمكن للتركيب الجمع بين بروتوكول علامة (من دون متطلبات) وبروتوكول وظيفي للتعبير عن القصد في نظام الأنواع.

protocol Secure {}
protocol Sendable2 { func send() -> String }

struct Packet: Secure, Sendable2 {
    func send() -> String { "sent securely" }
}
func transmit(_ p: Secure & Sendable2) { print(p.send()) }
transmit(Packet())

التركيب مقابل الأنواع العامة

التركيب (A & B) يلغي النوع الملموس، بينما تحافظ الأنواع العامة (<T: A & B>) عليه. استخدموا الأنواع العامة عندما تحتاجون إلى الربط بين أنواع المعلمات والقيم المرجعة.

protocol A { func a() -> String }
protocol B { func b() -> String }
struct S: A, B { func a() -> String { "a" }; func b() -> String { "b" } }

func generic<T: A & B>(_ x: T) -> T { print(x.a(), x.b()); return x }
_ = generic(S())

اختبار سريع

اختبروا مدى فهمكم لتركيب البروتوكولات.

مراجعة

يتيح تركيب البروتوكولات باستخدام & طلب التوافق مع بروتوكولات متعددة (وفئة واحدة اختياريًا) في الوقت نفسه، من دون تعريف بروتوكول جديد مدمج. يمكنكم تسمية التراكيب باستخدام typealias، واستخدامها في المعلمات والقيم المرجعة والمجموعات، وقد رأيتم كيف يختلف التركيب عن الأنواع العامة في الحفاظ على الأنواع الملموسة.

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

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

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

ماذا ستتعلم في «تركيب البروتوكولات»؟

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

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

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

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

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

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

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

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

  1. البروتوكولات كعقود
  2. التنفيذات الافتراضية في الامتدادات
  3. تركيب البروتوكولات
  4. المطابقة الشرطية
← العودة إلى Swift Academy