Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

التعدادات مع الدوال

جزء من قسم البرمجة كائنية التوجه في رحلة 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]
challenge icon

التحدي

سهل

أكمل التعداد 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]))
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: Playground لـ Swift