Menu
Coddy logo textTech

Riepilogo - Conto bancario

Fa parte della sezione Programmazione orientata agli oggetti del percorso Swift di Coddy. Lezione 21 di 57.

challenge icon

Sfida

Medio

Completa la classe BankAccount. Il suo inizializzatore fallibile init?(owner:deposit:) rifiuta un proprietario vuoto o un deposito iniziale negativo. balance e transactions sono private(set). deposit(_:) e withdraw(_:) generano AccountError.invalidAmount per importi inferiori a 1, mentre withdraw genera AccountError.insufficient(balance:) quando l’importo è maggiore del saldo; ogni modifica riuscita viene registrata in transactions come +50 o -20. statement() restituisce Ada: 30 (+50, -20) oppure Ada: 0 (no transactions).

Il codice fornito legge il proprietario e il deposito iniziale (name,amount), poi i comandi d n o w n. Stampa cannot open account se l’inizializzatore fallisce; altrimenti stampa invalid amount o insufficient funds (balance 10) per i comandi non riusciti e infine il rendiconto.

Il tuo codice va in AccountError.swift e BankAccount.swift. main.swift contiene il codice di input/output fornito e non può essere modificato.

Provalo tu

// Supplied input/output code: keep it as it is
var input: [String] = []
while let line = readLine() { input.append(line) }
let head = input[0].split(separator: ",", omittingEmptySubsequences: false).map(String.init)
if let account = BankAccount(owner: head[0], deposit: Int(head[1])!) {
    for cmd in input.dropFirst() {
        let p = cmd.split(separator: " ")
        let n = Int(p[1])!
        do {
            if p[0] == "d" { try account.deposit(n) } else { try account.withdraw(n) }
        } catch AccountError.insufficient(let balance) {
            print("insufficient funds (balance \(balance))")
        } catch {
            print("invalid amount")
        }
    }
    print(account.statement())
} else {
    print("cannot open account")
}

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Playground Swift