Повторение — платёжная система
Часть раздела Объектно-ориентированное программирование путешествия по Swift на Coddy. Урок 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)") }
}
Все уроки раздела Объектно-ориентированное программирование
1Классы и объекты
Работа с файламиОпределение классовМетоды и selfИнициализаторыКлассы — это ссылкиПовторение — читательский билет4Инкапсуляция
Контроль доступаТолько чтение извнеЗащита состоянияИнициализаторы с возможностью сбояПовторение — банковский счёт7Полиморфизм и обобщения
ПолиморфизмПриведение типовОбобщённые функцииОбобщённые типыПовторение — калькулятор фигур10Паттерны проектирования. Часть 2
Паттерн делегированияПаттерн декораторПаттерн строительПаттерн состояния2Структуры и типы-значения
СтруктурыСемантика значенийИзменяющие методыСтруктура или классПовторение — элемент инвентаря5Наследование
ПодклассыПереопределение методовИнициализаторы и superfinal и иерархииПовторение — иерархия сотрудников8Стандартные протоколы
CustomStringConvertibleEquatableComparableHashableПовторение — пользовательская сортировка11Проект: Управление библиотекой
Книги и читателиВыдача книг3Свойства: углублённое изучение
Вычисляемые свойстваНаблюдатели свойствСтатические членыПеречисления с методамиПовторение — журнал температуры6Протоколы
Определение протоколовСоответствие типовРасширения протоколовПротоколы как типыПовторение — платёжная системаПотренируйтесь самостоятельно: Песочница Swift