Menu
CoddyTech

Buku Besar Bank

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Swift di Coddy. Pelajaran 57 dari 57.

challenge icon

Tantangan

Sulit

Buat bank kecil. Account adalah class dengan id, owner, dan private(set) var balance, serta method deposit(_:) dan withdraw(_:) yang melempar BankError.invalidAmount (di bawah 1) dan BankError.insufficient(id:). Checking mengizinkan cerukan sebesar 100 (saldo dapat turun hingga -100); Savings menolak penarikan yang akan membuat saldo negatif, menambahkan bunga 1% (dibulatkan ke bawah) saat monthEnd(), dan mengizinkan paling banyak 2 penarikan per bulan (BankError.limit(id:)), yang diatur ulang oleh monthEnd(). Account.monthEnd() tidak melakukan apa pun. Class Bank menyimpan akun berdasarkan id dan memiliki transfer(from:to:amount:), yang melakukan penarikan dan setoran atau tidak mengubah apa pun jika gagal.

Kode yang disediakan membaca perintah open checking 1 ada, open savings 2 bo, dep 1 100, wd 2 30, tr 1 2 50 atau month, mencetak ok atau error (invalid amount, insufficient funds in 2, withdrawal limit on 2, no account 9), lalu mencetak setiap akun yang diurutkan berdasarkan id sebagai 1 ada checking: -20.

Kodemu ditulis di BankError.swift, Account.swift, Checking.swift, Savings.swift, dan Bank.swift. main.swift berisi kode input/output yang disediakan dan tidak boleh diedit.

Coba sendiri

// Kode input/output yang disediakan: biarkan apa adanya
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)")
}

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Playground Swift