Enum في Swift هو نوع يجمع مجموعة من القيم المرتبطة تحت اسم واحد. على عكس C و Objective-C، حيث enum هو مجرد مجموعة من الثوابت الصحيحة، يقدم Swift تعدادات من الدرجة الأولى مع associated values و raw values وطرق ودعم للبروتوكولات. وفقًا Apple، 2026، فإن enum هي إحدى الأدوات الرئيسية للنمذجة الآمنة من حيث النوع للحالات في تطوير iOS.
النقاط الرئيسية
Enum (تعداد) هو نوع بيانات مخصص يجمع مجموعة محدودة من الخيارات المتنافية. في Swift، enum ليس مجرد ثوابت رقمية، بل هو نوع كامل بمنطقه الخاص.
كل خيار من التعداد يُسمى حالة. على عكس Objective-C، حيث يقتصر enum على نوع صحيح، يسمح Swift لكل حالة بتخزين بياناتها الخاصة والحصول على طرق.
وفقًا Apple، يدعم enum في Swift الأدوية (generics) والمهيئات والخصائص المحسوبة وتنفيذ البروتوكولات — مما يجعله قابلًا للتطبيق لنمذجة الحالات والأخطاء والخيارات والآلات ذات الحالات المحدودة.
استخدم enum كلما احتجت إلى تمثيل مجموعة محدودة من الخيارات المتنافية: حالات الشاشة، أنواع الأخطاء، الاتجاهات، خيارات التصفية.
Enum يُعلن بالكلمة المفتاحية enum متبوعة باسم وجسم بين قوسين متعرجين.
enum CompassDirection {
case north
case south
case east
case west
}
يمكن تعريف الحالات في سطر واحد مفصولة بفاصلة:
enum Planet {
case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
}
للوصول إلى حالة، استخدم صيغة النقطة بعد معرفة النوع:
let direction = CompassDirection.north
// النوع معروف — الصيغة المختصرة متاحة:
var currentPlanet = .earth
بمجرد تعيين متغير لنوع enum معروف، Swift يستنتج النوع تلقائيًا، مما يسمح بحذف اسم التعداد عند الوصول إلى الحالات.
Raw Values هي قيم من نوع واحد تُخصص لكل حالة من حالات enum. على عكس associated values، raw values من نفس النوع لجميع الحالات ويتم تعريفها وقت الإعلان.
enum HTTPStatusCode: Int {
case ok = 200
case notFound = 404
case internalServerError = 500
}
let code = HTTPStatusCode.notFound
print(code.rawValue) // 404
بالنسبة لـ raw values الصحيحة، يقوم Swift تلقائيًا بزيادة القيم إذا تم تعيين الأولى فقط بشكل صريح:
enum Status: Int {
case pending = 1
case active // 2
case completed // 3
}
يمكن أن تكون raw values من الأنواع Int أو String أو Character أو أي نوع يتوافق مع بروتوكول RawRepresentable. يقوم Swift تلقائيًا بإنشاء المُهيئ init? لإنشاء enum من raw value — وهو مناسب لتحليل البيانات من APIs.
Associated Values تسمح بربط أنواع بيانات مختلفة بكل حالة من حالات enum على حدة. على عكس raw values، يمكن أن تختلف associated values في النوع والعدد.
enum NetworkError {
case timeout(seconds: Int)
case httpError(code: Int, message: String)
case noConnection
case unknown(error: Error)
}
عند المعالجة باستخدام switch، يتم استخراج associated_values من خلال الربط بالمتغيرات أو الثوابت:
let error = NetworkError.httpError(code: 403, message: "Forbidden")
switch error {
case .timeout(let seconds):
print("انتهت مهلة الانتظار بعد \(seconds)s")
case .httpError(let code, let message):
print("HTTP \(code): \(message)")
case .noConnection:
print("لا يوجد اتصال")
case .unknown(let err):
print("غير معروف: \(err.localizedDescription)")
}
وفقًا لوثائق Apple، تجعل associated values من enum أداة تعبيرية لنمذجة الحالات المعقدة دون إنشاء أنواع مغلفة منفصلة. استخدمها لسيناريوهات شبيهة بـ Result ونمذجة الأخطاء مع السياق.
Enum التكراري — تعداد تشير حالاته إلى نوع enum نفسه. تُعلَم هذه الحالات بالكلمة المفتاحية indirect.
indirect enum LinkedList<T> {
case empty
case node(value: T, next: LinkedList<T>)
}
استخدام indirect قبل enum يعلّم جميع الحالات كمتكررة. بدلاً من ذلك، يمكنك تعليم حالة محددة فقط بـ indirect:
enum ArithmeticExpression {
case number(Int)
indirect case addition(ArithmeticExpression, ArithmeticExpression)
indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}
يستخدم Swift indirect لتخزين الحالات المتكررة كمراجع (دلالات مرجعية) بدلاً من قيم — مما يمنع الحجم اللانهائي للتعداد على المكدس. تُستخدم التعدادات المتكررة على نطاق واسع في بناء الأشجار والقوائم المرتبطة و AST.
Enum يمكنه تنفيذ البروتوكولات تمامًا مثل الهياكل والفئات. هذه ميزة رئيسية للبرمجة الموجهة بالبروتوكولات في Swift.
protocol Describable {
var description: String { get }
}
enum PaymentMethod: Describable {
case creditCard(last4: String)
case applePay
case bankTransfer
var description: String {
switch self {
case .creditCard(let last4):
return "Card ending in \(last4)"
case .applePay:
return "Apple Pay"
case .bankTransfer:
return "Bank Transfer"
}
}
}
يمكن لـ Enum أيضًا تنفيذ بروتوكولات Cocoa — على سبيل المثال، CaseIterable لتوليد مجموعة تلقائية من جميع الحالات، أو Codable للتسلسل. وهذا يجعل enum كتلة بناء متعددة الاستخدامات في تطبيقات Swift.
الأسئلة الشائعة
Enum هو نوع بمجموعة محدودة من الخيارات المتنافية، بينما struct هو نوع بمجموعة عشوائية من الخصائص. لا يمكن أن يكون لـ Enum خصائص مخزنة (stored properties)، ولكنه يدعم الخصائص المحسوبة (computed properties) والطرق.
لا، لا يمكن أن يحتوي enum على raw values و associated values في نفس الوقت. Raw values هي قيم من نفس النوع لجميع الحالات، بينما associated values هي بيانات فردية لكل حالة. هاتان الآليتان متنافيتان.
أضف توافقًا مع بروتوكول CaseIterable. سيقوم Swift تلقائيًا بتوليد الخاصية allCases، التي تعيد مجموعة من جميع الحالات بترتيب الإعلان. هذا مناسب للتكرار على جميع الخيارات.
Switch هو الطريقة الأكثر أمانًا لأن المترجم يتحقق من التغطية الشاملة. يمكنك استخدام if case للتحقق من حالة واحدة أو == لـ enum بدون associated values.
نعم، يدعم enum الأدوية: enum Result<T, E> { case success(T); case failure(E) }. هذا يسمح بإنشاء تركيبات عامة آمنة من حيث النوع لمعالجة النجاح والخطأ.
الخلاصة
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.