0Pricing
Swift Academy · درس

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

حدّد الأنواع المرتبطة في السياقات العامة.

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

مراجعة الأنواع المرتبطة

يمكن للبروتوكول تعريف نوع مرتبط باستخدام associatedtype، وهو عنصر نائب يحدده النوع المتوافق. ويُعد Element في بروتوكول الحاوية المثال الكلاسيكي.

protocol Container {
    associatedtype Item
    var count: Int { get }
    func item(at i: Int) -> Item
}

التوافق مع نوع ملموس

يحدد النوع المتوافق النوع المرتبط، وغالبًا ما يُستدل عليه من طريقة استخدامه.

protocol Container {
    associatedtype Item
    func item(at i: Int) -> Item
}
struct IntBox: Container {
    let values: [Int]
    func item(at i: Int) -> Int { values[i] }
}
print(IntBox(values: [10, 20]).item(at: 1))

تقييد النوع المرتبط

أضيفوا قيدًا مباشرةً في التعريف: associatedtype Item: Comparable يفرض أن يدعم نوع العنصر لدى كل نوع متوافق المقارنة.

protocol Sorted {
    associatedtype Item: Comparable
    var items: [Item] { get }
}
struct Nums: Sorted { let items: [Int] }
print(Nums(items: [3, 1, 2]).items.sorted())

استخدام القيد

بما أن النوع المرتبط مقيّد، يمكن لامتدادات البروتوكول الاعتماد على تلك الإمكانية.

protocol Sorted {
    associatedtype Item: Comparable
    var items: [Item] { get }
}
extension Sorted {
    var smallest: Item? { items.min() }
}
struct Nums: Sorted { let items: [Int] }
print(Nums(items: [5, 2, 8]).smallest!)

where مع associatedtype

تسمح Swift أيضًا باستخدام جملة where مع نوع مرتبط لربطه بنوع مرتبط آخر أو بنوع متداخل.

protocol Sequence2 {
    associatedtype Element
    associatedtype Iterator: IteratorProtocol where Iterator.Element == Element
}

التقييد ببروتوكول آخر

يمكن طلب توافق النوع المرتبط مع بروتوكول عرّفتموه، مما يضيف السلوك على مراحل.

protocol HasName { var name: String { get } }
protocol Registry {
    associatedtype Entry: HasName
    var entries: [Entry] { get }
}
struct User: HasName { let name: String }
struct Users: Registry { let entries: [User] }
print(Users(entries: [User(name: "Ada")]).entries[0].name)

أنواع مرتبطة متعددة

يمكن للبروتوكول تعريف عدة أنواع مرتبطة، مع تقييد كل منها بشكل مستقل.

protocol Mapping {
    associatedtype Key: Hashable
    associatedtype Value
    func value(for k: Key) -> Value?
}
struct Phonebook: Mapping {
    let data: [String: Int]
    func value(for k: String) -> Int? { data[k] }
}
print(Phonebook(data: ["x": 1]).value(for: "x")!)

النوع المرتبط الافتراضي

يمكنكم منح النوع المرتبط قيمة افتراضية باستخدام =، وتُستخدم عندما لا يحدده النوع المتوافق بطريقة أخرى.

protocol Producer {
    associatedtype Output = String
    func make() -> Output
}
struct Hello: Producer {
    func make() -> String { "hi" }
}
print(Hello().make())

القيود تتيح الخوارزميات العامة

عند تقييد نوع مرتبط، يمكن لامتداد البروتوكول تنفيذ خوارزميات فعلية مشتركة بين جميع الأنواع المتوافقة.

protocol Scored {
    associatedtype Score: Comparable
    var scores: [Score] { get }
}
extension Scored {
    var best: Score? { scores.max() }
}
struct Game: Scored { let scores: [Int] }
print(Game(scores: [10, 40, 25]).best!)

قيود تساوي النوع في الامتدادات

خارج البروتوكول، يمكنكم فرض قيود إضافية على النوع المرتبط عند تمديد البروتوكول.

protocol Box2 {
    associatedtype Content
    var content: Content { get }
}
extension Box2 where Content == Int {
    var doubled: Int { content * 2 }
}
struct IB: Box2 { let content: Int }
print(IB(content: 7).doubled)

لماذا نضع القيود؟

يتيح تقييد الأنواع المرتبطة للبروتوكولات أن تبقى عامة وقوية في الوقت نفسه: فالقيد وعد يمكن للامتداد والجهات المستدعية الاعتماد عليه.

protocol Listy {
    associatedtype E: Equatable
    var elements: [E] { get }
}
extension Listy {
    func has(_ x: E) -> Bool { elements.contains(x) }
}
struct L: Listy { let elements: [String] }
print(L(elements: ["a", "b"]).has("b"))

اختبار سريع

اختبروا مدى فهمكم لتقييد الأنواع المرتبطة.

مراجعة

يمكنكم تقييد الأنواع المرتبطة مباشرةً (associatedtype Item: Comparable)، وربطها باستخدام جمل where، وطلب توافقها مع بروتوكول، ومنحها قيمًا افتراضية باستخدام =، وتعريف عدة أنواع مرتبطة، وتحسينها في الامتدادات. وتتيح القيود لامتدادات البروتوكولات تنفيذ خوارزميات مشتركة وآمنة من حيث النوع.

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

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

نعم — نص درس «تقييد الأنواع المرتبطة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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. عبارات where في الدوال
  3. تقييد الأنواع المرتبطة
  4. الفهارس الفرعية والامتدادات العامة
← العودة إلى Swift Academy