Menu
Coddy logo textTech

Повторение — платёжная система

Часть раздела Объектно-ориентированное программирование путешествия по Swift на Coddy. Урок 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