Menu
Coddy logo textTech

Repaso - Cuenta bancaria

Parte de la sección Programación orientada a objetos del Journey de Swift de Coddy. Lección 21 de 57.

challenge icon

Desafío

Intermedio

Completa la clase BankAccount. Su inicializador que puede fallar init?(owner:deposit:) rechaza un propietario vacío o un depósito inicial negativo. balance y transactions son private(set). deposit(_:) y withdraw(_:) lanzan AccountError.invalidAmount para cantidades inferiores a 1, y withdraw lanza AccountError.insufficient(balance:) cuando la cantidad es mayor que el saldo; cada cambio exitoso se registra en transactions como +50 o -20. statement() devuelve Ada: 30 (+50, -20) o Ada: 0 (no transactions).

El código proporcionado lee el propietario y el depósito inicial (name,amount), después los comandos d n o w n. Imprime cannot open account cuando falla el inicializador; de lo contrario, imprime invalid amount o insufficient funds (balance 10) para los comandos fallidos y, finalmente, el estado de la cuenta.

Tu código debe ir en AccountError.swift y BankAccount.swift. main.swift contiene el código proporcionado de entrada/salida y no se puede editar.

Pruébalo tú mismo

// Código de entrada/salida suministrado: déjalo tal como está
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")
}

Todas las lecciones de Programación orientada a objetos

Practica por tu cuenta: Playground de Swift