Menu
Coddy logo textTech

Registre bancaire

Fait partie de la section Programmation orientée objet du Journey Swift de Coddy. Leçon 57 sur 57.

challenge icon

Défi

Difficile

Construisez une petite banque. Account est une classe avec id, owner et private(set) var balance, ainsi que les méthodes deposit(_:) et withdraw(_:) qui lèvent BankError.invalidAmount (inférieur à 1) et BankError.insufficient(id:). Checking autorise un découvert de 100 (le solde peut descendre jusqu’à -100) ; Savings refuse les retraits qui rendraient le solde négatif, ajoute 1 % d’intérêts (arrondi à l’entier inférieur) dans monthEnd() et autorise au maximum 2 retraits par mois (BankError.limit(id:)), réinitialisés par monthEnd(). Account.monthEnd() ne fait rien. La classe Bank stocke les comptes par identifiant et possède transfer(from:to:amount:), qui effectue un retrait et un dépôt, ou n’effectue rien en cas d’échec.

Le code fourni lit les commandes open checking 1 ada, open savings 2 bo, dep 1 100, wd 2 30, tr 1 2 50 ou month, affiche ok ou l’erreur (invalid amount, insufficient funds in 2, withdrawal limit on 2, no account 9), puis affiche finalement chaque compte trié par identifiant sous la forme 1 ada checking: -20.

Votre code doit se trouver dans BankError.swift, Account.swift, Checking.swift, Savings.swift et Bank.swift. main.swift contient le code fourni pour les entrées et les sorties et ne peut pas être modifié.

Essayez vous-même

// Code d'entrée/sortie fourni : le garder tel quel
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)")
}

Toutes les leçons de Programmation orientée objet

Entraînez-vous par vous-même : Playground Swift