Enum در Swift نوعی است که گروهی از مقادیر مرتبط را تحت یک نام ترکیب میکند. بر خلاف C و Objective-C، جایی که enum فقط مجموعهای از ثابتهای عدد صحیح است، Swift شمارشهای first-class با associated values، raw values، متدها و پشتیبانی از پروتکلها ارائه میدهد. به گفته Apple، 2026، enum یکی از ابزارهای کلیدی مدلسازی type-safe حالات در توسعه iOS است.
نکات کلیدی
Enum (شمارش) — یک نوع داده کاربردی است که مجموعه محدودی از گزینههای متقابل را ترکیب میکند. در Swift، enum فقط ثابتهای عددی نیست، بلکه یک نوع کامل با منطق خاص خود است.
هر گزینه شمارش case نامیده میشود. بر خلاف Objective-C، جایی که enum به نوع عدد صحیح محدود میشود، Swift به هر case اجازه میدهد دادههای خاص خود را ذخیره کند و متد داشته باشد.
به گفته Apple، enum در Swift از جنریکها، مقداردهندهها، ویژگیهای محاسبهشده و پیادهسازی پروتکلها پشتیبانی میکند — این آن را برای مدلسازی حالات، خطاها، گزینهها و ماشینهای حالت مفید میکند.
از enum در هر جایی که نیاز به نمایش مجموعه محدود گزینههای متقابل دارید استفاده کنید: حالات صفحه، انواع خطا، جهتها، گزینههای فیلتر.
Enum با کلمه کلیدی enum و به دنبال آن نام و بدنه در آکولاد اعلان میشود.
enum CompassDirection {
case north
case south
case east
case west
}
Caseها را میتوان در یک خط با کاما اعلان کرد:
enum Planet {
case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
}
برای دسترسی به case از نحو نقطهای بعد از نوع شناخته شده استفاده میشود:
let direction = CompassDirection.north
// نوع شناخته شده است — نحو کوتاه در دسترس است:
var currentPlanet = .earth
پس از انتساب به متغیر از نوع enum شناخته شده، Swift به طور خودکار نوع را استنتاج میکند و میتوان نام شمارش را هنگام دسترسی به caseها حذف کرد.
Raw Values — مقادیری از یک نوع هستند که به هر case از enum اختصاص مییابند. بر خلاف associated values، raw values از نظر نوع برای همه caseها یکسان هستند و در زمان اعلان تعیین میشوند.
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 تولید میکند — این برای تجزیه دادههای API مفید است.
Associated Values امکان اتصال انواع مختلف داده به هر case شمارش را به صورت جداگانه فراهم میکند. بر خلاف 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 را به ابزاری رسا برای مدلسازی حالات پیچیده بدون ایجاد انواع wrapper جداگانه تبدیل میکند. از آنها برای سناریوهای Result-like و مدلسازی خطاها با زمینه استفاده کنید.
enum بازگشتی — شمارشی که caseهای آن به خود نوع enum ارجاع میدهند. این caseها با کلمه کلیدی indirect مشخص میشوند.
indirect enum LinkedList<T> {
case empty
case node(value: T, next: LinkedList<T>)
}
کلمه کلیدی indirect قبل از enum همه caseها را به عنوان بازگشتی علامتگذاری میکند. به طور جایگزین میتوان فقط یک case خاص را با indirect علامتگذاری کرد:
enum ArithmeticExpression {
case number(Int)
indirect case addition(ArithmeticExpression, ArithmeticExpression)
indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}
Swift از indirect برای ذخیره caseهای بازگشتی به عنوان ارجاع (reference semantics) به جای مقادیر استفاده میکند — این از اندازه نامتناهی enum در پشته جلوگیری میکند. enumهای بازگشتی به طور گسترده در ساخت درختان، لیستهای پیوندی و 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 برای تولید خودکار مجموعه همه caseها یا Codable برای سریالسازی. این enum را به یک بلوک ساختمانی جهانی در برنامههای Swift تبدیل میکند.
سوالات متداول
Enum — نوعی با مجموعه محدودی از گزینههای متقابل است، در حالی که struct نوعی با مجموعه دلخواهی از ویژگیهاست. Enum نمیتواند stored properties داشته باشد، اما از computed properties و متدها پشتیبانی میکند.
خیر، enum نمیتواند همزمان raw values و associated values داشته باشد. Raw values — مقادیری از یک نوع برای همه caseها هستند، associated values — دادههای جداگانه برای هر case. این مکانیسمها متقابل هستند.
پروتکل CaseIterable را اضافه کنید. Swift به طور خودکار ویژگی allCases را تولید میکند که مجموعه همه caseها را به ترتیب اعلان برمیگرداند. این برای تکرار روی همه گزینهها مفید است.
Switch — امنترین روش است زیرا کامپایلر پوشش کامل را بررسی میکند. میتوان از if case برای بررسی یک case یا == برای enum بدون associated values استفاده کرد.
بله، enum از جنریکها پشتیبانی میکند: enum Result<T, E> { case success(T); case failure(E) }. این امکان ایجاد سازههای عمومی type-safe برای پردازش موفقیت و خطا را فراهم میکند.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید