Extension في Swift هي آلية تسمح بإضافة وظائف جديدة إلى الأنواع الموجودة دون تعديل كودها المصدر. تدعم الإضافات الأساليب، الخصائص المحسوبة، المُهيئات، المؤشرات الفرعية، الأنواع المتداخلة وتنفيذ البروتوكولات. وفقاً توثيق Apple، 2026، تعتبر الإضافات أداة رئيسية لتنظيم الكود والالتزام بمبدأ الفتح/الإغلاق في مشاريع Swift.
الخلاصة
Extension في Swift هي بناء لغوي يسمح بتوسيع نوع موجود (فئة، بنية، تعداد، بروتوكول) بإمكانيات جديدة. يشبه الفئات في Objective-C لكن بقدرات أكبر.
يمكن للإضافة أن تضيف:
وفقاً لتوثيق Apple، لا يمكن للإضافة تجاوز الأساليب الموجودة (الإرسال الديناميكي) ولا يمكنها إضافة خصائص مخزنة. هذه القيود تحافظ على سلامة النوع الأصلي.
Extension تُعلن بالكلمة المفتاحية extension متبوعة بالنوع الذي يتم توسيعه.
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 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 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 منفصلة.
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 ليست مجرد ميزة لغوية بل أداة للتنظيم المعماري. الاستخدام السليم للإضافات يجعل الكود قابلاً للقراءة والصيانة.
// MARK: - Equatable للتنقلprivate// 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 تضيف وظائف دون إنشاء نوع جديد. Subclassing تنشئ تسلسلاً هرمياً وتدعم التجاوز. Extension لا تتطلب الوصول إلى الكود المصدر الأصلي وتعمل مع جميع الأنواع.
نعم، يمكن للإضافة أن تكون عامة إذا كان النوع الموسع عاماً: extension Array where Element: Numeric. يمكن أيضاً إضافة أساليب عامة داخل extension بمعاملات نوع خاصة بها.
Extension لا تؤثر على الأداء — يتم ترجمة أساليب extension كأساليب عادية. للبروتوكولات مع extension يُستخدم الإرسال الثابت، الذي قد يكون أسرع من الإرسال الديناميكي للفئات.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.