復習 - 決済システム
CoddyのSwiftジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 31/57。
チャレンジ
難しいプロトコルを使用して支払いシステムを設計してください。PaymentMethod は name、fee(for amount: Int) -> Int、および mutating func pay(_ amount: Int) -> Bool を必要とします。プロトコル拡張は total(for:)(金額に手数料を加えたもの)を提供します。Card(手数料は切り捨てで2%、常に成功し、payments をカウントする)、Wallet(保存された balance を持ち、手数料はなく、合計額が残高を超える場合は失敗し、それ以外では残高を減らす)、および GiftCard(保存された balance を持ち、手数料はなく、支払える範囲で支払う。残高が不足している場合は拒否する)を実装してください。checkout(_:with:) を完成させてください。この関数は、指定された順序で各支払い方法を試し、最初に成功した方法について paid 100 with wallet (fee 0) を返します。成功する方法がない場合は declined を返します。また、更新された支払い方法も返すため、購入の間で残高が引き継がれます。
用意されたコードはウォレット残高とギフトカード残高を読み込み、その後に購入金額を読み込みます。各購入では、ギフトカード、ウォレット、カードの順に試行して結果を出力し、最後に残高を出力します。
コードは PaymentMethod.swift、Card.swift、Wallet.swift、GiftCard.swift、および Functions.swift に記述します。main.swift には用意された入出力コードが含まれており、編集できません。
自分で試してみよう
// 提供された入出力コード: そのままにしておく
var input: [String] = []
while let line = readLine() { input.append(line) }
var methods: [any PaymentMethod] = [GiftCard(balance: Int(input[1])!), Wallet(balance: Int(input[0])!), Card()]
for line in input.dropFirst(2) {
let (result, updated) = checkout(Int(line)!, with: methods)
methods = updated
print(result)
}
for m in methods {
if let g = m as? GiftCard { print("gift card left \(g.balance)") }
if let w = m as? Wallet { print("wallet left \(w.balance)") }
if let c = m as? Card { print("card payments \(c.payments)") }
}
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Swiftプレイグラウンド