Registre bancaire
Fait partie de la section Programmation orientée objet du Journey Swift de Coddy. Leçon 57 sur 57.
Défi
DifficileConstruisez 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
1Classes et objets
Travailler avec des fichiersDéfinir des classesMéthodes et selfInitialiseursLes classes sont des référencesRécapitulatif - Carte de bibliothèque4Encapsulation
Contrôle d’accèsLecture seule depuis l’extérieurProtection de l’étatInitialiseurs pouvant échouerRécapitulatif - Compte bancaire7Polymorphisme et génériques
PolymorphismeConversion de typeFonctions génériquesTypes génériquesRécapitulatif - Calculateur de formes2Structures et types valeur
StructuresSémantique de valeurMéthodes mutantesStructure ou classeRécapitulatif - article d’inventaire5Héritage
Sous-classesRedéfinition des méthodesInitialiseurs et superfinal et hiérarchiesRécapitulatif - hiérarchie des employés8Protocoles standard
CustomStringConvertibleEquatableComparableHashableRécapitulatif - Tri personnalisé11Projet : Gestion de bibliothèque
Livres et membresEmprunter des livresEntraînez-vous par vous-même : Playground Swift