Menu
CoddyTech

Sổ cái ngân hàng

Thuộc phần Lập trình hướng đối tượng trong hành trình Swift của Coddy. Bài học 57 trên 57.

challenge icon

Thử thách

Khó

Xây dựng một ngân hàng nhỏ. Account là một lớp có id, owner và private(set) var balance, cùng các phương thức deposit(_:) và withdraw(_:), có thể ném ra BankError.invalidAmount (nhỏ hơn 1) và BankError.insufficient(id:). Checking cho phép thấu chi 100 (số dư có thể giảm xuống -100); Savings từ chối các lần rút tiền khiến số dư âm, cộng lãi suất 1% (làm tròn xuống) trong monthEnd() và cho phép rút tiền tối đa 2 lần mỗi tháng (BankError.limit(id:)), số lần rút được đặt lại bởi monthEnd(). Account.monthEnd() không làm gì cả. Lớp Bank lưu trữ các tài khoản theo id và có transfer(from:to:amount:), phương thức này rút tiền rồi gửi tiền, hoặc không làm gì nếu thất bại.

Code được cung cấp đọc các lệnh open checking 1 ada, open savings 2 bo, dep 1 100, wd 2 30, tr 1 2 50 hoặc month, in ra ok hoặc lỗi (invalid amount, insufficient funds in 2, withdrawal limit on 2, no account 9), rồi cuối cùng in ra từng tài khoản, sắp xếp theo id, dưới dạng 1 ada checking: -20.

Code của bạn sẽ nằm trong BankError.swift, Account.swift, Checking.swift, Savings.swift và Bank.swift. main.swift chứa code đầu vào/đầu ra được cung cấp và bạn không thể chỉnh sửa tệp này.

Tự làm thử

// Đoạn code đầu vào/đầu ra đã được cung cấp: giữ nguyên
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)")
}

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Playground Swift