Enum در Swift — چیست، نحو و استفاده

نویسنده: IT Sectr منتشر شده: 2026-06-17 زمان مطالعه: 6 دقیقه

Enum در Swift نوعی است که گروهی از مقادیر مرتبط را تحت یک نام ترکیب می‌کند. بر خلاف C و Objective-C، جایی که enum فقط مجموعه‌ای از ثابت‌های عدد صحیح است، Swift شمارش‌های first-class با associated values، raw values، متدها و پشتیبانی از پروتکل‌ها ارائه می‌دهد. به گفته Apple، 2026، enum یکی از ابزارهای کلیدی مدل‌سازی type-safe حالات در توسعه iOS است.

نکات کلیدی

  • Enum — نوعی برای گروهی از مقادیر مرتبط که type-safety را تضمین می‌کند
  • Raw values — مقادیر یکسان از یک نوع برای همه caseهای شمارش
  • Associated values — انواع مختلف داده که به هر case به صورت جداگانه متصل می‌شوند
  • Caseها با کلمه کلیدی case اعلان می‌شوند و می‌توانند شامل متدها باشند
  • Switch با enum نیاز به پوشش کامل همه گزینه‌ها توسط کامپایلر دارد

enum در Swift چیست؟

Enum (شمارش) — یک نوع داده کاربردی است که مجموعه محدودی از گزینه‌های متقابل را ترکیب می‌کند. در Swift، enum فقط ثابت‌های عددی نیست، بلکه یک نوع کامل با منطق خاص خود است.

هر گزینه شمارش case نامیده می‌شود. بر خلاف Objective-C، جایی که enum به نوع عدد صحیح محدود می‌شود، Swift به هر case اجازه می‌دهد داده‌های خاص خود را ذخیره کند و متد داشته باشد.

به گفته Apple، enum در Swift از جنریک‌ها، مقداردهنده‌ها، ویژگی‌های محاسبه‌شده و پیاده‌سازی پروتکل‌ها پشتیبانی می‌کند — این آن را برای مدل‌سازی حالات، خطاها، گزینه‌ها و ماشین‌های حالت مفید می‌کند.

از enum در هر جایی که نیاز به نمایش مجموعه محدود گزینه‌های متقابل دارید استفاده کنید: حالات صفحه، انواع خطا، جهت‌ها، گزینه‌های فیلتر.

نحو اعلان enum

Enum با کلمه کلیدی enum و به دنبال آن نام و بدنه در آکولاد اعلان می‌شود.

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

Caseها را می‌توان در یک خط با کاما اعلان کرد:

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

برای دسترسی به case از نحو نقطه‌ای بعد از نوع شناخته شده استفاده می‌شود:

swift
let direction = CompassDirection.north
// نوع شناخته شده است — نحو کوتاه در دسترس است:
var currentPlanet = .earth

پس از انتساب به متغیر از نوع enum شناخته شده، Swift به طور خودکار نوع را استنتاج می‌کند و می‌توان نام شمارش را هنگام دسترسی به caseها حذف کرد.

Raw Values در شمارش‌ها

Raw Values — مقادیری از یک نوع هستند که به هر case از enum اختصاص می‌یابند. بر خلاف associated values، raw values از نظر نوع برای همه caseها یکسان هستند و در زمان اعلان تعیین می‌شوند.

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 تولید می‌کند — این برای تجزیه داده‌های API مفید است.

Associated Values در enum

Associated Values امکان اتصال انواع مختلف داده به هر case شمارش را به صورت جداگانه فراهم می‌کند. بر خلاف 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 را به ابزاری رسا برای مدل‌سازی حالات پیچیده بدون ایجاد انواع wrapper جداگانه تبدیل می‌کند. از آنها برای سناریوهای Result-like و مدل‌سازی خطاها با زمینه استفاده کنید.

enum بازگشتی (indirect)

enum بازگشتی — شمارشی که caseهای آن به خود نوع enum ارجاع می‌دهند. این caseها با کلمه کلیدی indirect مشخص می‌شوند.

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

کلمه کلیدی indirect قبل از enum همه caseها را به عنوان بازگشتی علامت‌گذاری می‌کند. به طور جایگزین می‌توان فقط یک case خاص را با indirect علامت‌گذاری کرد:

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

Swift از indirect برای ذخیره caseهای بازگشتی به عنوان ارجاع (reference semantics) به جای مقادیر استفاده می‌کند — این از اندازه نامتناهی enum در پشته جلوگیری می‌کند. enumهای بازگشتی به طور گسترده در ساخت درختان، لیست‌های پیوندی و 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 برای تولید خودکار مجموعه همه caseها یا 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 — مقادیری از یک نوع برای همه caseها هستند، associated values — داده‌های جداگانه برای هر case. این مکانیسم‌ها متقابل هستند.

چگونه آرایه همه caseهای enum را بدست آوریم؟

پروتکل CaseIterable را اضافه کنید. Swift به طور خودکار ویژگی allCases را تولید می‌کند که مجموعه همه caseها را به ترتیب اعلان برمی‌گرداند. این برای تکرار روی همه گزینه‌ها مفید است.

آیا استفاده از switch برای پردازش enum اجباری است؟

Switch — امن‌ترین روش است زیرا کامپایلر پوشش کامل را بررسی می‌کند. می‌توان از if case برای بررسی یک case یا == برای enum بدون associated values استفاده کرد.

آیا می‌توان enum با جنریک ایجاد کرد؟

بله، enum از جنریک‌ها پشتیبانی می‌کند: enum Result<T, E> { case success(T); case failure(E) }. این امکان ایجاد سازه‌های عمومی type-safe برای پردازش موفقیت و خطا را فراهم می‌کند.

خلاصه

  • Enum در Swift — نوع کاملی با پشتیبانی از متدها، جنریک‌ها و پروتکل‌ها
  • Raw values امکان تعیین مقادیر یکسان از یک نوع برای همه caseها را فراهم می‌کند
  • Associated values امکان اتصال داده‌های مختلف به هر case را می‌دهد
  • Indirect caseها برای ساختارهای بازگشتی در enum ضروری هستند
  • پروتکل‌ها می‌توانند توسط enum پیاده‌سازی شوند — این اساس POP در Swift است
  • Switch با enum پردازش کامل را در سطح کامپایل تضمین می‌کند
  • از enum برای مدل‌سازی حالات محدود و گزینه‌های type-safe استفاده کنید

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید