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.
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
1Lớp và đối tượng
Làm việc với tệpĐịnh nghĩa lớpPhương thức và selfHàm khởi tạoLớp là tham chiếuÔn tập: Thẻ thư viện2Struct và kiểu giá trị
StructNgữ nghĩa giá trịPhương thức thay đổiStruct hay classÔn tập: mặt hàng trong kho5Kế thừa
Lớp conGhi đè phương thứcHàm khởi tạo và superfinal và hệ phân cấpÔn tập: hệ phân cấp nhân viên8Các giao thức tiêu chuẩn
CustomStringConvertibleEquatableComparableHashableÔn tập: Sắp xếp tùy chỉnhTự luyện tập: Playground Swift