은행 원장
Coddy Swift 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 57번째.
챌린지
어려움작은 은행을 만드세요. Account는 id, owner 및 private(set) var balance를 가지는 클래스이며, BankError.invalidAmount(1 미만)와 BankError.insufficient(id:)를 발생시키는 deposit(_:) 및 withdraw(_:) 메서드를 가집니다. Checking은 100의 초과 인출을 허용하므로 잔액이 -100까지 내려갈 수 있습니다. Savings는 잔액을 음수로 만드는 인출을 거부하고, monthEnd()에서 1%의 이자를 추가하며(내림 처리), 한 달에 최대 2회의 인출만 허용합니다(BankError.limit(id:)). 인출 횟수는 monthEnd()에서 초기화됩니다. Account.monthEnd()는 아무 작업도 하지 않습니다. Bank 클래스는 계정을 id별로 저장하며, 인출과 입금을 수행하는 transfer(from:to:amount:)를 가집니다. 작업이 실패하면 아무것도 변경되지 않습니다.
제공된 코드는 open checking 1 ada, open savings 2 bo, dep 1 100, wd 2 30, tr 1 2 50 또는 month 명령을 읽고, ok 또는 오류(invalid amount, insufficient funds in 2, withdrawal limit on 2, no account 9)를 출력합니다. 마지막으로 각 계정을 id순으로 정렬하여 1 ada checking: -20과 같은 형식으로 출력합니다.
코드는 BankError.swift, Account.swift, Checking.swift, Savings.swift 및 Bank.swift에 작성합니다. main.swift에는 제공된 입력/출력 코드가 들어 있으며 수정할 수 없습니다.
직접 해보기
// 제공된 입출력 코드: 있는 그대로 유지하세요
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)")
}
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: Swift 플레이그라운드