Menu
Coddy logo textTech

Podsumowanie – system płatności

Część sekcji Programowanie obiektowe ścieżki Swift w Coddy. Lekcja 31 z 57.

challenge icon

Wyzwanie

Trudny

Zaprojektuj 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

Poćwicz samodzielnie: Edytor online Swift