التعدادات مع الدوال
جزء من قسم البرمجة كائنية التوجه في رحلة Swift على Coddy. الدرس 15 من 57.
يعرّف enum نوعًا بمجموعة ثابتة من الحالات. تُكتب القيم باستخدام نقطة، ويجب أن يتعامل switch مع كل حالة، لذلك فإن إضافة حالة لاحقًا تُظهر كل موضع يحتاج إلى تحديث:
enum Direction {
case north, east, south, west
}
let heading = Direction.east
switch heading {
case .north: print("up")
case .east: print("right")
case .south: print("down")
case .west: print("left")
}الناتج:
rightيمكن للتعدادات أن تحتوي على أساليب وخصائص محسوبة. بداخلها، self هي الحالة الحالية:
enum Direction {
case north, east, south, west
var turnedRight: Direction {
switch self {
case .north: return .east
case .east: return .south
case .south: return .west
case .west: return .north
}
}
}
print(Direction.north.turnedRight)
print(Direction.west.turnedRight.turnedRight)الناتج:
east
eastتربط القيمة الأولية قيمةً ثابتة من نوع واحد بكل حالة. ويعمل init(rawValue:) في الاتجاه الآخر ويُرجع nil عندما لا تتطابق أي حالة:
enum Size: String {
case small = "S", medium = "M", large = "L"
}
print(Size.medium.rawValue)
print(Size(rawValue: "L") == .large)
print(Size(rawValue: "XL") == nil)الناتج:
M
true
trueالقيم المرتبطة تتيح لكل حالة حمل بياناتها الخاصة، وهذا هو ما يسمح لنوع واحد باحتواء قيم مختلفة البنية. يربط switch البيانات باستخدام let:
enum Payment {
case cash(amount: Int)
case card(number: String, amount: Int)
var amount: Int {
switch self {
case .cash(let amount): return amount
case .card(_, let amount): return amount
}
}
}
let payments: [Payment] = [.cash(amount: 20), .card(number: "4242", amount: 55)]
print(payments.map { $0.amount })الناتج:
[20, 55]التحدي
سهلأكمل التعداد Command بالحالات forward وback وleft وright، مع إسناد القيم الخام F وB وL وR إليها. أضف خاصية محسوبة step تُرجع التغيير في الموضع: forward تساوي 1، وback تساوي -1، بينما left وright تساويان 0. ثم أكمل run(_:)، التي تحوّل كل محرف إلى أمر باستخدام init(rawValue:) (مع تخطي المحارف غير المعروفة)، وتُرجع position 2, turns 1, skipped 1.
يقرأ الكود المُ provided سطرًا واحدًا من أحرف الأوامر ويطبع نتيجة run(_:).
ضع الكود في Command.swift وFunctions.swift. يحتوي main.swift على كود الإدخال/الإخراج المُ provided ولا يمكن تعديله.
جرّب بنفسك
// كود الإدخال/الإخراج المُزوَّد: اتركه كما هو
var input: [String] = []
while let line = readLine() { input.append(line) }
print(run(input[0]))
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1الأصناف والكائنات
العمل مع الملفاتتعريف الأصنافالأساليب وselfالمُهيِّئاتالأصناف هي مراجعمراجعة - بطاقة المكتبة4التغليف
التحكم في الوصولللقراءة فقط من الخارجحماية الحالةالمهيئات القابلة للفشلمراجعة - الحساب البنكي7تعدد الأشكال والأنواع العامة
تعدد الأشكالتحويل الأنواعالدوال العامةالأنواع العامةمراجعة - حاسبة الأشكال3الخصائص بتعمّق
الخصائص المحسوبةمراقبو الخصائصالأعضاء الثابتةالتعدادات مع الدوالمراجعة - سجل درجات الحرارةتدرّب بنفسك: Playground لـ Swift