Enum في Swift — ما هو، بناء الجملة والاستخدام

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

Enum في Swift هو نوع يجمع مجموعة من القيم المرتبطة تحت اسم واحد. على عكس C و Objective-C، حيث enum هو مجرد مجموعة من الثوابت الصحيحة، يقدم Swift تعدادات من الدرجة الأولى مع associated values و raw values وطرق ودعم للبروتوكولات. وفقًا Apple، 2026، فإن enum هي إحدى الأدوات الرئيسية للنمذجة الآمنة من حيث النوع للحالات في تطوير iOS.

النقاط الرئيسية

  • Enum — نوع لمجموعة من القيم المرتبطة، يضمن أمان النوع
  • Raw Values — قيم من نفس النوع تُخصص لجميع حالات التعداد
  • Associated Values — أنواع بيانات مختلفة تُرفق بكل حالة على حدة
  • الحالات تُعلن بكلمة case ويمكن أن تحتوي على طرق
  • Switch مع enum يتطلب معالجة شاملة من قبل المترجم

ما هو Enum في Swift؟

Enum (تعداد) هو نوع بيانات مخصص يجمع مجموعة محدودة من الخيارات المتنافية. في Swift، enum ليس مجرد ثوابت رقمية، بل هو نوع كامل بمنطقه الخاص.

كل خيار من التعداد يُسمى حالة. على عكس Objective-C، حيث يقتصر enum على نوع صحيح، يسمح Swift لكل حالة بتخزين بياناتها الخاصة والحصول على طرق.

وفقًا Apple، يدعم enum في Swift الأدوية (generics) والمهيئات والخصائص المحسوبة وتنفيذ البروتوكولات — مما يجعله قابلًا للتطبيق لنمذجة الحالات والأخطاء والخيارات والآلات ذات الحالات المحدودة.

استخدم enum كلما احتجت إلى تمثيل مجموعة محدودة من الخيارات المتنافية: حالات الشاشة، أنواع الأخطاء، الاتجاهات، خيارات التصفية.

بناء جملة تعريف Enum

Enum يُعلن بالكلمة المفتاحية enum متبوعة باسم وجسم بين قوسين متعرجين.

swift
enum CompassDirection {
    case north
    case south
    case east
    case west
}

يمكن تعريف الحالات في سطر واحد مفصولة بفاصلة:

swift
enum Planet {
    case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
}

للوصول إلى حالة، استخدم صيغة النقطة بعد معرفة النوع:

swift
let direction = CompassDirection.north
// النوع معروف — الصيغة المختصرة متاحة:
var currentPlanet = .earth

بمجرد تعيين متغير لنوع enum معروف، Swift يستنتج النوع تلقائيًا، مما يسمح بحذف اسم التعداد عند الوصول إلى الحالات.

Raw Values في التعدادات

Raw Values هي قيم من نوع واحد تُخصص لكل حالة من حالات enum. على عكس associated values، raw values من نفس النوع لجميع الحالات ويتم تعريفها وقت الإعلان.

swift
enum HTTPStatusCode: Int {
    case ok = 200
    case notFound = 404
    case internalServerError = 500
}

let code = HTTPStatusCode.notFound
print(code.rawValue) // 404

بالنسبة لـ raw values الصحيحة، يقوم Swift تلقائيًا بزيادة القيم إذا تم تعيين الأولى فقط بشكل صريح:

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

Associated Values تسمح بربط أنواع بيانات مختلفة بكل حالة من حالات enum على حدة. على عكس raw values، يمكن أن تختلف associated values في النوع والعدد.

swift
enum NetworkError {
    case timeout(seconds: Int)
    case httpError(code: Int, message: String)
    case noConnection
    case unknown(error: Error)
}

عند المعالجة باستخدام switch، يتم استخراج associated_values من خلال الربط بالمتغيرات أو الثوابت:

swift
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 التكراري (indirect)

Enum التكراري — تعداد تشير حالاته إلى نوع enum نفسه. تُعلَم هذه الحالات بالكلمة المفتاحية indirect.

swift
indirect enum LinkedList<T> {
    case empty
    case node(value: T, next: LinkedList<T>)
}

استخدام indirect قبل enum يعلّم جميع الحالات كمتكررة. بدلاً من ذلك، يمكنك تعليم حالة محددة فقط بـ indirect:

swift
enum ArithmeticExpression {
    case number(Int)
    indirect case addition(ArithmeticExpression, ArithmeticExpression)
    indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}

يستخدم Swift indirect لتخزين الحالات المتكررة كمراجع (دلالات مرجعية) بدلاً من قيم — مما يمنع الحجم اللانهائي للتعداد على المكدس. تُستخدم التعدادات المتكررة على نطاق واسع في بناء الأشجار والقوائم المرتبطة و AST.

Enum والبروتوكولات

Enum يمكنه تنفيذ البروتوكولات تمامًا مثل الهياكل والفئات. هذه ميزة رئيسية للبرمجة الموجهة بالبروتوكولات في Swift.

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 في Swift؟

Enum هو نوع بمجموعة محدودة من الخيارات المتنافية، بينما struct هو نوع بمجموعة عشوائية من الخصائص. لا يمكن أن يكون لـ Enum خصائص مخزنة (stored properties)، ولكنه يدعم الخصائص المحسوبة (computed properties) والطرق.

هل يمكن أن يحتوي enum على raw values و associated values في نفس الوقت؟

لا، لا يمكن أن يحتوي enum على raw values و associated values في نفس الوقت. Raw values هي قيم من نفس النوع لجميع الحالات، بينما associated values هي بيانات فردية لكل حالة. هاتان الآليتان متنافيتان.

كيف أحصل على مصفوفة بجميع حالات enum؟

أضف توافقًا مع بروتوكول CaseIterable. سيقوم Swift تلقائيًا بتوليد الخاصية allCases، التي تعيد مجموعة من جميع الحالات بترتيب الإعلان. هذا مناسب للتكرار على جميع الخيارات.

هل من الإلزامي استخدام switch لمعالجة enum؟

Switch هو الطريقة الأكثر أمانًا لأن المترجم يتحقق من التغطية الشاملة. يمكنك استخدام if case للتحقق من حالة واحدة أو == لـ enum بدون associated values.

هل يمكن إنشاء enum باستخدام الأدوية (Generics)؟

نعم، يدعم enum الأدوية: enum Result<T, E> { case success(T); case failure(E) }. هذا يسمح بإنشاء تركيبات عامة آمنة من حيث النوع لمعالجة النجاح والخطأ.

الخلاصة

  • Enum في Swift هو نوع كامل مع دعم للطرق والأدوية والبروتوكولات
  • Raw Values تسمح بتعيين قيم من نفس النوع لجميع الحالات
  • Associated Values تتيح ربط بيانات مختلفة بكل حالة
  • حالات Indirect ضرورية للهياكل المتكررة في enum
  • البروتوكولات يمكن تنفيذها بواسطة enum — وهذا أساس POP في Swift
  • Switch مع enum يضمن معالجة شاملة على مستوى الترجمة
  • استخدم enum لنمذجة الحالات المحدودة والخيارات الآمنة من حيث النوع

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

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

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

اقرأ أيضًا