Bankbuch
Teil des Abschnitts Objektorientierte Programmierung der Swift-Journey von Coddy. Lektion 57 von 57.
Aufgabe
SchwerErstelle 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
1Klassen und Objekte
Arbeiten mit DateienKlassen definierenMethoden und selfInitialisiererKlassen sind ReferenzenRückblick – Bibliotheksausweis4Kapselung
ZugriffskontrolleVon außen schreibgeschütztZustand schützenFehlschlagende InitialisiererRückblick – Bankkonto7Polymorphismus und Generika
PolymorphismusTypumwandlungGenerische FunktionenGenerische TypenZusammenfassung – Shape-Rechner2Strukturen und Werttypen
StrukturenWertsemantikVerändernde MethodenStruktur oder KlasseZusammenfassung – Inventarelement5Vererbung
UnterklassenMethoden überschreibenInitialisierer und superfinal und HierarchienRückblick – Mitarbeiterhierarchie8Standardprotokolle
CustomStringConvertibleEquatableComparableHashableRückblick – Benutzerdefiniertes Sortieren11Projekt: Bibliotheksverwaltung
Bücher und MitgliederBücher ausleihenÜbe selbstständig: Swift-Playground