0Pricing
Swift Academy · درس

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

اشترط مطابقة المعلمات العامة للبروتوكولات.

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

مراجعة الأنواع العامة

تستخدم الدالة العامة معلمة نوع مثل <T> لكي تعمل مع أنواع متعددة. لكن لا يمكن تمرير T غير المقيّد إلا من دون فحصه أو استخدام خصائصه. أما القيود فتتيح الإمكانات.

func identity<T>(_ x: T) -> T { x }
print(identity(5))
print(identity("hi"))

قيد Comparable

يضمن تعريف <T: Comparable> أن قيم T تدعم < و> وما شابهما، بحيث يمكنكم مقارنتها.

func largest<T: Comparable>(_ a: T, _ b: T) -> T {
    a > b ? a : b
}
print(largest(3, 9))
print(largest("apple", "pear"))

سبب الحاجة إلى القيود

من دون Comparable، يرفض المصرّف التعبير a > b لأن الأنواع لا تدعم جميعها هذه العملية. والقيد هو الوعد الذي يجعل العملية قانونية.

func minOf<T: Comparable>(_ list: [T]) -> T? {
    list.min()
}
print(minOf([4, 2, 8])!)

قيد Equatable

يتيح Equatable استخدام == و!=. استخدموه لعدّ العناصر المتطابقة أو العثور عليها.

func count<T: Equatable>(_ x: T, in list: [T]) -> Int {
    list.filter { $0 == x }.count
}
print(count(2, in: [2, 3, 2, 2]))

قيد Hashable

يتيح Hashable استخدام القيم كعناصر في Set أو كمفاتيح في القواميس.

func unique<T: Hashable>(_ list: [T]) -> [T] {
    Array(Set(list))
}
print(unique([1, 1, 2, 3, 3]).sorted())

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

يمكن أن يكون أي بروتوكول قيدًا. وهنا يتيح بروتوكول مخصص استخدام أسلوبه مع معلمة النوع العام.

protocol Speaker { func speak() -> String }
struct Dog: Speaker { func speak() -> String { "Woof" } }

func announce<T: Speaker>(_ x: T) {
    print(x.speak())
}
announce(Dog())

قيود الفئات

يمكنكم اشتراط أن يرث T من فئة معينة، مما يتيح الوصول إلى أعضاء تلك الفئة.

class Animal { func name() -> String { "animal" } }
class Cat: Animal { override func name() -> String { "cat" } }

func describe<T: Animal>(_ x: T) { print(x.name()) }
describe(Cat())

قيود متعددة

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

func show<T: CustomStringConvertible & Equatable>(_ a: T, _ b: T) {
    print(a.description, a == b)
}
show(5, 5)

معلمات أنواع متعددة

يمكن أن تحتوي الدالة على عدة معلمات مقيّدة، لكل منها متطلباتها الخاصة.

func zipMap<K: Hashable, V>(_ keys: [K], _ vals: [V]) -> [K: V] {
    var d: [K: V] = [:]
    for (k, v) in zip(keys, vals) { d[k] = v }
    return d
}
print(zipMap(["a", "b"], [1, 2]))

القيود على الأنواع

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

struct SortedBox<T: Comparable> {
    var items: [T]
    var smallest: T? { items.min() }
}
print(SortedBox(items: [5, 1, 9]).smallest!)

القيود العددية

تتيح البروتوكولات القياسية مثل Numeric للشيفرة العامة إجراء العمليات الحسابية على Int وDouble وغيرهما.

func sum<T: Numeric>(_ list: [T]) -> T {
    list.reduce(0, +)
}
print(sum([1, 2, 3]))
print(sum([1.5, 2.5]))

اختبار سريع

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

مراجعة

تخبر قيود معلمات النوع (<T: Protocol> أو <T: SomeClass>) المصرّف بما يستطيع النوع العام فعله. وقد رأيتم Comparable وEquatable وHashable وNumeric والبروتوكولات المخصصة وقيود الفئات والقيود المتعددة باستخدام & والقيود على الأنواع العامة.

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

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

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

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

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

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

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

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

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

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

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

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

  1. قيود معلمات النوع
  2. عبارات where في الدوال
  3. تقييد الأنواع المرتبطة
  4. الفهارس الفرعية والامتدادات العامة
← العودة إلى Swift Academy