Menu
Coddy logo textTech

Bankbuch

Teil des Abschnitts Objektorientierte Programmierung der Swift-Journey von Coddy. Lektion 57 von 57.

challenge icon

Aufgabe

Schwer

Erstelle eine kleine Bank. Account ist eine Klasse mit id, owner und einer private(set) var balance sowie den Methoden deposit(_:) und withdraw(_:), die BankError.invalidAmount (unter 1) und BankError.insufficient(id:) auslösen. Checking erlaubt eine Überziehung von 100 (der Kontostand darf bis auf -100 sinken); Savings lehnt Abhebungen ab, durch die der Kontostand negativ würde, addiert in monthEnd() 1 % Zinsen (abgerundet) und erlaubt höchstens 2 Abhebungen pro Monat (BankError.limit(id:)), die durch monthEnd() zurückgesetzt werden. Account.monthEnd() tut nichts. Die Klasse Bank speichert Konten nach ihrer ID und verfügt über transfer(from:to:amount:), das eine Abhebung und Einzahlung durchführt oder bei einem Fehler keine Änderung hinterlässt.

Der bereitgestellte Code liest die Befehle open checking 1 ada, open savings 2 bo, dep 1 100, wd 2 30, tr 1 2 50 oder month, gibt ok oder den Fehler aus (invalid amount, insufficient funds in 2, withdrawal limit on 2, no account 9) und gibt schließlich jedes Konto nach ID sortiert als 1 ada checking: -20 aus.

Dein Code gehört in BankError.swift, Account.swift, Checking.swift, Savings.swift und Bank.swift. main.swift enthält den bereitgestellten Eingabe-/Ausgabecode und darf nicht bearbeitet werden.

Probier es selbst

// Gelieferter Ein-/Ausgabecode: belasse ihn wie er ist
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)")
}

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Swift-Playground