Menu
Coddy logo textTech

復習 - 決済システム

CoddyのSwiftジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 31/57。

challenge icon

チャレンジ

難しい

プロトコルを使用して支払いシステムを設計してください。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プレイグラウンド