복습 - 결제 시스템
Coddy Swift 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 31번째.
챌린지
어려움프로토콜을 사용하여 결제 시스템을 설계하세요. PaymentMethod는 name, fee(for amount: Int) -> Int 및 mutating func pay(_ amount: Int) -> Bool를 요구합니다. 프로토콜 확장은 total(for:)(금액에 수수료를 더한 값)를 제공합니다. Card(수수료는 2%이며 내림하고, 항상 성공하며, payments를 계산함), Wallet(저장된 balance가 있고 수수료가 없으며, 총액이 잔액보다 많으면 실패하고 그렇지 않으면 잔액을 차감함) 및 GiftCard(저장된 balance가 있고 수수료가 없으며, 가능한 금액만 결제하고 잔액이 부족하면 거부함)를 구현하세요. 각 결제 수단을 주어진 순서대로 시도하고, 처음 성공한 결제 수단에 대해 paid 100 with wallet (fee 0)을 반환하거나, 모두 실패하면 declined를 반환하는 checkout(_:with:)을 완성하세요. 또한 구매 간에 잔액이 유지되도록 업데이트된 결제 수단도 반환합니다.
제공된 코드는 지갑 잔액과 기프트 카드 잔액을 읽은 다음 구매 금액을 읽습니다. 각 구매에 대해 기프트 카드, 지갑, 카드 순서로 시도하고 결과를 출력한 다음 최종 잔액을 출력합니다.
코드는 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 플레이그라운드