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

دفتر الأستاذ المصرفي

جزء من قسم البرمجة كائنية التوجه في رحلة Swift على Coddy. الدرس 57 من 57.

challenge icon

التحدي

صعب

أنشئ بنكًا صغيرًا. Account هو صنف يحتوي على id وowner وprivate(set) var balance، وعلى الطريقتين deposit(_:) وwithdraw(_:) اللتين ترميان الخطأ BankError.invalidAmount (عندما تكون القيمة أقل من 1) والخطأ BankError.insufficient(id:). يسمح Checking بالسحب على المكشوف بمقدار 100 (يمكن أن ينخفض الرصيد إلى -100)؛ بينما يرفض Savings عمليات السحب التي تجعل الرصيد سالبًا، ويضيف فائدة بنسبة 1% (مع التقريب إلى أسفل) في monthEnd()، ويسمح بحد أقصى يبلغ عمليتي سحب شهريًا (BankError.limit(id:))، ويُعاد ضبط هذا العدد بواسطة monthEnd(). لا تفعل Account.monthEnd() شيئًا. يخزّن الصنف Bank الحسابات بحسب المعرّف، ويحتوي على transfer(from:to:amount:)، الذي يسحب ويودع، أو لا يُجري أي تغيير عند الفشل.

يقرأ الكود المزوَّد الأوامر open checking 1 ada أو open savings 2 bo أو dep 1 100 أو wd 2 30 أو tr 1 2 50 أو month، ويطبع ok أو الخطأ (invalid amount أو insufficient funds in 2 أو withdrawal limit on 2 أو no account 9)، ثم يطبع أخيرًا كل حساب مرتبًا بحسب المعرّف بالشكل 1 ada checking: -20.

ضع كودك في BankError.swift وAccount.swift وChecking.swift وSavings.swift وBank.swift. يحتوي main.swift على كود الإدخال/الإخراج المزوَّد، ولا يمكن تعديله.

جرّب بنفسك

// كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
var input: [String] = []
while let line = readLine() { input.append(line) }
let bank = Bank()
for cmd in input {
    let p = cmd.split(separator: " ").map(String.init)
    do {
        switch p[0] {
        case "open":
            let id = Int(p[2])!
            bank.accounts[id] = p[1] == "savings" ? Savings(id: id, owner: p[3]) : Checking(id: id, owner: p[3])
        case "dep": try bank.account(Int(p[1])!).deposit(Int(p[2])!)
        case "wd": try bank.account(Int(p[1])!).withdraw(Int(p[2])!)
        case "tr": try bank.transfer(from: Int(p[1])!, to: Int(p[2])!, amount: Int(p[3])!)
        default: bank.accounts.values.forEach { $0.monthEnd() }
        }
        print("ok")
    } catch BankError.invalidAmount {
        print("invalid amount")
    } catch BankError.insufficient(let id) {
        print("insufficient funds in \(id)")
    } catch BankError.limit(let id) {
        print("withdrawal limit on \(id)")
    } catch BankError.noAccount(let id) {
        print("no account \(id)")
    } catch {
        print("error")
    }
}
for id in bank.accounts.keys.sorted() {
    let a = bank.accounts[id]!
    print("\(a.id) \(a.owner) \(a.kind): \(a.balance)")
}

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

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