الأصناف العامة (Generics) في Swift: لماذا هي ضرورية وكيفية استخدامها

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: ما هي الأدوية العامة (Generics) ولماذا هي مهمة في Swift



الأدوية العامة (Generics) هي واحدة من أقوى وأكثر ميزات لغة Swift أناقة. فهي تسمح لك بكتابة كود مرن وقابل لإعادة الاستخدام يعمل مع أي نوع بيانات مع الحفاظ على الكتابة القوية. إذا سبق لك استخدام Array<Int> أو Dictionary<String, Any> أو Optional<T> — فقد واجهت بالفعل الأدوية العامة.



في هذه المقالة، سنستكشف لماذا نحتاج إلى الأدوية العامة في Swift، وكيف تعمل عمليًا، ونعرض أمثلة لتطوير iOS/macOS. ستكون المادة مفيدة لكل من المبتدئين والمطورين ذوي الخبرة الذين يتطلعون إلى تنظيم معرفتهم.



1. لماذا نحتاج إلى الأدوية العامة في Swift؟



الغرض الرئيسي من الأدوية العامة هو تجنب تكرار الكود وتحسين الأمان. تخيل أنك تحتاج إلى كتابة دالة تقوم بتبديل قيمتين. بدون الأدوية العامة، سيتعين عليك إنشاء دوال منفصلة لكل من Int و String و Double، وهكذا:



func swapInts(_ a: inout Int, _ b: inout Int) {    let temp = a    a = b    b = temp}

func swapStrings(_ a: inout String, _ b: inout String) { let temp = a a = b b = temp}


مع الأدوية العامة، يتم حل هذه المهمة بدالة واحدة شاملة:



func swapValues<T>(_ a: inout T, _ b: inout T) {    let temp = a    a = b    b = temp}

var x = 10, y = 20swapValues(&x, &y) // x = 20, y = 10

var name1 = "Alice", name2 = "Bob"swapValues(&name1, &name2) // name1 = "Bob", name2 = "Alice"


مزايا الأدوية العامة:

  • إعادة استخدام الكود: دالة/نوع واحد يعمل مع أي نوع بيانات.
  • سلامة الأنواع: يقوم المترجم بفحص الأنواع في وقت الترجمة، مما يلغي أخطاء وقت التشغيل.
  • الأداء: يتم تنفيذ الأدوية العامة في Swift من خلال تعدد الأشكال في وقت الترجمة (التخصص)، لذلك لا يوجد عبء إضافي من تحويل الأنواع.
  • قابلية القراءة: يصبح الكود أكثر تجريدًا وإيجازًا.


2. الدوال العامة: بناء الجملة والأمثلة



يتم تعريف الدالة العامة باستخدام الأقواس الزاوية <T>، حيث T هو عنصر نائب للنوع. يمكنك استخدام أي معرف: T أو Element أو Value، إلخ.



مثال أساسي: إيجاد فهرس عنصر



func findIndex<T: Equatable>(of value: T, in array: [T]) -> Int? {    for (index, item) in array.enumerated() {        if item == value {            return index        }    }    return nil}

let numbers = [1, 3, 5, 7, 9]if let index = findIndex(of: 5, in: numbers) { print("Index of number 5: \\(index)") // Index of number 5: 2}


لاحظ القيد <T: Equatable>. هذا قيد نوع. يخبر المترجم: "يجب أن يتوافق T مع بروتوكول Equatable". بدون هذا القيد، لن يكون العامل == متاحًا.



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



يمكنك استخدام معاملات متعددة للأنواع:



func combine<T, U>(_ first: T, with second: U) -> String {    return "\\(first) + \\(second)"}

let result = combine(42, with: "answer")print(result) // 42 + answer


3. الأنواع العامة: إنشاء هياكل وفئات عامة



لا تنطبق الأدوية العامة على الدوال فحسب، بل على الأنواع أيضًا. المثال الأكثر شيوعًا هو Array<Element>. دعنا ننشئ هيكلنا العام الخاص — مكدس (LIFO):



struct Stack<Element> {    private var items: [Element] = []        mutating func push(_ item: Element) {        items.append(item                

المدونات

توصيات الكتب