Extension في Swift: ما هو، الصيغة وكيفية إضافة الأساليب

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

Extension في Swift هي آلية تسمح بإضافة وظائف جديدة إلى الأنواع الموجودة دون تعديل كودها المصدر. تدعم الإضافات الأساليب، الخصائص المحسوبة، المُهيئات، المؤشرات الفرعية، الأنواع المتداخلة وتنفيذ البروتوكولات. وفقاً توثيق Apple، 2026، تعتبر الإضافات أداة رئيسية لتنظيم الكود والالتزام بمبدأ الفتح/الإغلاق في مشاريع Swift.

الخلاصة

  • Extension — إضافة وظائف للأنواع الموجودة دون تعديل الأصل
  • الخصائص المحسوبة — تُضاف عبر extension، المخزنة لا
  • امتثال البروتوكول — تنفيذ بروتوكول عبر extension لأي نوع
  • تنظيم الكود — الإضافات تجمع المنطق المرتبط حسب البروتوكولات
  • مفتوح/مغلق — الإضافات تنفذ مبدأ الانفتاح للتوسيع

ما هو Extension في Swift؟

Extension في Swift هي بناء لغوي يسمح بتوسيع نوع موجود (فئة، بنية، تعداد، بروتوكول) بإمكانيات جديدة. يشبه الفئات في Objective-C لكن بقدرات أكبر.

يمكن للإضافة أن تضيف:

  • خصائص محسوبة — للنسخة والنوع
  • أساليب — للنسخة والنوع
  • مهيئات (convenience init)
  • مؤشرات فرعية
  • أنواع متداخلة
  • امتثالات للبروتوكولات

وفقاً لتوثيق Apple، لا يمكن للإضافة تجاوز الأساليب الموجودة (الإرسال الديناميكي) ولا يمكنها إضافة خصائص مخزنة. هذه القيود تحافظ على سلامة النوع الأصلي.

صيغة الإضافات

Extension تُعلن بالكلمة المفتاحية extension متبوعة بالنوع الذي يتم توسيعه.

swift
extension Double {
    var km: Double { return self * 1000.0 }
    var cm: Double { return self / 100.0 }
    var mm: Double { return self / 1000.0 }
}

let distance = 5.0.km
print("5 km = \(distance) meters") // 5000.0

يمكن توسيع ليس فقط الأنواع الخاصة بل أيضاً أنواع المكتبة القياسية في Swift وFoundation وUIKit والأطر الأخرى. هذا يجعل extension أداة قوية لإضافة وظائف خاصة بالمجال.

إضافة الأساليب عبر extension

Extension تسمح بإضافة أساليب للنسخة والنوع إلى أي نوع موجود.

swift
extension String {
    func isValidEmail() -> Bool {
        let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}"
        return self.range(of: emailRegex, options: .regularExpression) != nil
    }

    static func random(length: Int) -> String {
        let letters = "abcdefghijklmnopqrstuvwxyz0123456789"
        return String((0..<length).map { _ in letters.randomElement()! })
    }
}

let email = "user@example.com"
print(email.isValidEmail()) // true
let code = String.random(length: 8) // "a3f8k2m1"

الأساليب المتحولة توسع أنواع القيم (struct, enum) ويمكنها تعديل self. بالنسبة للفئات، ليست هناك حاجة للتحول. يمكن للإضافة إضافة أساليب متحولة حتى لأنواع المكتبة القياسية.

الخصائص المحسوبة في extension

Extension يمكنها فقط إضافة خصائص محسوبة — الخصائص المخزنة غير مسموحة. هذا منطقي لأن extension لا تدير ذاكرة النوع الأصلي.

swift
extension Date {
    var isPast: Bool {
        return self < Date()
    }

    var isToday: Bool {
        return Calendar.current.isDateInToday(self)
    }
}

let someDate = Date().addingTimeInterval(3600)
print(someDate.isPast) // false (one hour from now is future)

الخصائص المحسوبة في extension تتبع نفس القواعد المتبعة في التنفيذ الأساسي: يمكن إنشاء خصائص { get } و { get set }. Swift لا يضع حداً لعدد الإضافات لنوع واحد. يمكنك تعريف أي عدد من الإضافات لنوع واحد في ملفات مختلفة — هذه ممارسة قياسية في المشاريع الكبيرة.

امتثال البروتوكول عبر extension

Extension هي الطريقة المفضلة لتنفيذ البروتوكولات. بدلاً من ازدحام التصريح الرئيسي للنوع، توضع جميع أساليب البروتوكول في extension منفصلة.

swift
struct User {
    let id: Int
    let name: String
    let email: String
}

// Extension per protocol — clean separation
extension User: Equatable {
    static func == (lhs: User, rhs: User) -> Bool {
        return lhs.id == rhs.id
    }
}

extension User: Codable {
    enum CodingKeys: String, CodingKey {
        case id, name, email
    }
}

هذا النهج يفصل المسؤوليات: يحتوي الهيكل الرئيسي فقط على خصائص مخزنة، والإضافات تحتوي على تنفيذات البروتوكولات. Swift حتى تسمح بتنفيذ بروتوكول عبر extension لأنواع لا نتحكم بها.

Extension وتنظيم الكود

Extension ليست مجرد ميزة لغوية بل أداة للتنظيم المعماري. الاستخدام السليم للإضافات يجعل الكود قابلاً للقراءة والصيانة.

  • التجميع حسب البروتوكول — كل بروتوكول في extension منفصل
  • العلامات (MARK)// MARK: - Equatable للتنقل
  • فصل الملفات — إضافات لبروتوكولات مختلفة في ملفات مختلفة
  • المساعدات الخاصة — الأساليب الخاصة في extension تُوسم بـ private
swift
// MARK: - User + Displayable
extension User: Displayable {
    var displayName: String {
        return "\(name) (\(email))"
    }
}

وفقاً إرشادات تصميم Swift API، تحسن الإضافات readability: يرى المطور هيكل البيانات في التصريح الرئيسي والمنطق في الإضافات. يتماشى هذا مع مبدأ فصل الواجهات.

الإضافة مع قيود where تضيف أساليب فقط لأنواع محددة: extension Array where Element: Equatable { func isUnique() -> Bool }. هذا الكود موجز وآمن من حيث النوع — تظهر طريقة isUnique فقط على المصفوفات ذات عناصر Equatable، مما يلغي الأخطاء في وقت الترجمة ويجعل API أكثر نظافة وأماناً ووضوحاً للمطورين الآخرين.

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

هل يمكن للإضافة إضافة خصائص مخزنة؟

لا، لا يمكن للإضافة إضافة خصائص مخزنة. هذا القيد أساسي: الإضافة لا تشارك في تخصيص الذاكرة لنسخة النوع. للخصائص المخزنة، استخدم التصريح الرئيسي للنوع.

هل يمكن تجاوز طريقة موجودة عبر extension؟

لا، لا يمكن للإضافة تجاوز الأساليب. محاولة تعريف طريقة بنفس التوقيع لطريقة موجودة ستؤدي إلى خطأ في الترجمة. للتجاوز، استخدم وراثة الفئات.

كيف تختلف extension عن subclassing؟

Extension تضيف وظائف دون إنشاء نوع جديد. Subclassing تنشئ تسلسلاً هرمياً وتدعم التجاوز. Extension لا تتطلب الوصول إلى الكود المصدر الأصلي وتعمل مع جميع الأنواع.

هل يمكن للإضافة أن تكون عامة؟

نعم، يمكن للإضافة أن تكون عامة إذا كان النوع الموسع عاماً: extension Array where Element: Numeric. يمكن أيضاً إضافة أساليب عامة داخل extension بمعاملات نوع خاصة بها.

كيف تؤثر extension على الأداء؟

Extension لا تؤثر على الأداء — يتم ترجمة أساليب extension كأساليب عادية. للبروتوكولات مع extension يُستخدم الإرسال الثابت، الذي قد يكون أسرع من الإرسال الديناميكي للفئات.

الملخص

  • Extension تضيف خصائص محسوبة وأساليب وبروتوكولات ومؤشرات فرعية
  • الخصائص المخزنة غير مسموحة — extension لا تخصص ذاكرة
  • امتثال البروتوكول عبر extension هو معيار تنظيم الكود في Swift
  • مبدأ الفتح/الإغلاق — النوع مفتوح للتوسيع، مغلق للتعديل
  • الإضافات العامة مع جمل where توفر سلوكاً متخصصاً
  • قابلية القراءة — الإضافات تجمع المنطق حسب البروتوكولات والوظائف

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

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

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

اقرأ أيضًا