enumها و الگوها (Swift Enums & Patterns)
«اِنوم (Enum)» یعنی نوعی با چند حالت محدود. مثل وضعیت بازی: برد، باخت، مساوی. «الگو (Pattern)» یعنی روشی برای تشخیص و گرفتن داده هر حالت. بنابراین، با سوییچ، حالت مناسب را می گیریم.
تعریف پایه enum سوئیفت
با enum یک نوع با چند «حالت (Case)» می سازیم. سپس مقدار می گیریم و چاپ می کنیم. اینجا یک نمونه ساده از جهت ها است.
enum Direction {
case north, south, east, west;
}
let d: Direction = .east;
print(d);
نکته: نقطه کوتاه .east وقتی نوع معلوم است، کافی است.
Associated Values؛ داده همراه هر حالت
گاهی هر حالت، داده متفاوت می خواهد. «مقدار وابسته (Associated Value)» همان داده همراه است. مثل بارکد: یا UPC با چهار عدد، یا QR با یک متن.
enum Barcode {
case upc(Int, Int, Int, Int);
case qr(String);
}
let b1 = Barcode.upc(8, 85909, 51226, 3);
let b2 = Barcode.qr("HELLO");
هشدار: نوع ها باید درست و به ترتیب فرستاده شوند.
الگوها و switch؛ استخراج مقادیر
با switch روی مقدار اِنوم می چرخیم. سپس با «الگوی let» داده داخل هر حالت را می گیریم و استفاده می کنیم.
func describe(_ code: Barcode) {
switch code {
case .upc(let numberSystem, let manufacturer, let product, let check):
print("UPC: \(numberSystem)-\(manufacturer)-\(product)-\(check)");
case .qr(let text):
print("QR: \(text)");
}
}
describe(b1);
describe(b2);
نکته: برای یک حالت خاص، می توانی از if case هم استفاده کنی.
Raw Value؛ نگاشت به مقدار خام
گاهی لازم است هر حالت یک «مقدار خام (Raw Value)» ثابت داشته باشد. مثل کدهای وضعیت HTTP. سپس می توانی از مقدار خام، نمونه بسازی.
enum HTTPStatus: Int {
case ok = 200;
case notFound = 404;
}
let status = HTTPStatus(rawValue: 200);
print(status == .ok);
نکته: اگر مقدار نامعتبر بدهی، سازنده nil برمی گرداند.
مسیر مطالعه مرتبط
برای مقادیر خالی، صفحه اختیاری ها را ببین. همین طور درباره بسته های کد، Closureها مطالعه کن. همچنین این صفحه «enum سوئیفت» مرجع سریع توست.
تمرین مرحله ای enum سوئیفت
- یک enum برای وضعیت تکلیف مدرسه بساز.
- برای هر حالت، پیام مناسب چاپ کن.
- یک enum با مقدار وابسته طراحی کن.
- با switch مقادیر را استخراج و خلاصه چاپ کن.
نکته: وقتی هر حالت داده متفاوت دارد، مقدار وابسته بهتر است.
جمع بندی سریع
- enum یعنی چند حالت محدود.
- الگوها داده داخل حالت را می گیرند.
- associated value برای داده متفاوت هر حالت است.
- raw value برای نگاشت ثابت به اعداد یا رشته هاست.
- switch خوانایی تصمیم ها را بهتر می کند.