復習 - 銀行口座
CoddyのSwiftジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 21/57。
チャレンジ
中級クラス BankAccount を完成させてください。その可失敗イニシャライザ init?(owner:deposit:) は、owner が空の場合、または初期預金が負の場合に失敗します。balance と transactions は private(set) です。deposit(_:) と withdraw(_:) は、1 未満の金額に対して AccountError.invalidAmount をスローし、withdraw は金額が残高を超える場合に AccountError.insufficient(balance:) をスローします。成功した変更はすべて、+50 または -20 として transactions に記録されます。statement() は Ada: 30 (+50, -20)、または Ada: 0 (no transactions) を返します。
提供されたコードは owner と初期預金(name,amount)を読み込み、その後にコマンド d n または w n を読み込みます。イニシャライザが失敗した場合は cannot open account を出力し、それ以外の場合は失敗したコマンドに対して invalid amount または insufficient funds (balance 10) を出力し、最後にステートメントを出力します。
コードは AccountError.swift と BankAccount.swift に記述してください。main.swift には提供された入出力コードが含まれており、編集できません。
自分で試してみよう
// 提供された入出力コード: そのままにしておく
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")
}
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Swiftプレイグラウンド