Podsumowanie – system płatności
Część sekcji Programowanie obiektowe ścieżki Swift w Coddy. Lekcja 31 z 57.
Wyzwanie
TrudnyZaprojektuj system płatności z użyciem protokołów. PaymentMethod wymaga właściwości name, metody fee(for amount: Int) -> Int oraz metody mutating func pay(_ amount: Int) -> Bool. Rozszerzenie protokołu udostępnia total(for:) (kwota powiększona o opłatę). Zaimplementuj Card (opłata wynosi 2% zaokrąglone w dół, płatność zawsze się udaje, zlicza payments), Wallet (przechowywane balance, bez opłaty, płatność nie udaje się, gdy łączna kwota przekracza saldo, a w przeciwnym razie saldo zostaje pomniejszone) oraz GiftCard (przechowywane balance, bez opłaty, płaci tyle, ile może: gdy saldo jest zbyt małe, płatność zostaje odrzucona). Uzupełnij checkout(_:with:), które próbuje użyć kolejnych metod płatności w podanej kolejności i zwraca paid 100 with wallet (fee 0) dla pierwszej metody, która zadziała, albo declined, gdy żadna z nich nie zadziała. Zwraca też zaktualizowane metody, aby ich salda były zachowywane między zakupami.
Dostarczony kod odczytuje saldo portfela i saldo karty podarunkowej, a następnie kwoty zakupów. Przy każdym zakupie próbuje użyć kolejno karty podarunkowej, portfela i karty, wypisuje wynik, a następnie końcowe salda.
Twój kod umieść w plikach PaymentMethod.swift, Card.swift, Wallet.swift, GiftCard.swift i Functions.swift. main.swift zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
// Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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)") }
}
Wszystkie lekcje w sekcji Programowanie obiektowe
1Klasy i obiekty
Praca z plikamiDefiniowanie klasMetody i selfInicjalizatoryKlasy są referencjamiPowtórzenie — karta biblioteczna4Hermetyzacja
Kontrola dostępuTylko do odczytu z zewnątrzOchrona stanuInicjalizatory, które mogą zawieśćPodsumowanie — konto bankowe7Polimorfizm i typy generyczne
PolimorfizmRzutowanie typówFunkcje generyczneTypy generycznePodsumowanie – kalkulator kształtów2Struktury i typy wartościowe
StrukturySemantyka wartościMetody modyfikująceStruktura czy klasaPodsumowanie – element inwentarza5Dziedziczenie
PodklasyPrzesłanianie metodInicjalizatory i superfinal i hierarchiePodsumowanie — hierarchia pracowników8Standardowe protokoły
CustomStringConvertibleEquatableComparableHashablePodsumowanie — własne sortowanie11Projekt: Zarządzanie biblioteką
Książki i czytelnicyWypożyczanie książek3Właściwości w szczegółach
Właściwości obliczaneObserwatory właściwościElementy statyczneTypy wyliczeniowe z metodamiPodsumowanie – rejestr temperatury6Protokoły
Definiowanie protokołówTypy zgodneRozszerzenia protokołówProtokoły jako typyPodsumowanie – system płatnościPoćwicz samodzielnie: Edytor online Swift