Menu
Coddy logo textTech

Riepilogo - Sistema di pagamento

Fa parte della sezione Programmazione orientata agli oggetti del percorso Swift di Coddy. Lezione 31 di 57.

challenge icon

Sfida

Difficile

Progetta un sistema di pagamento con i protocolli. PaymentMethod richiede name, fee(for amount: Int) -> Int e mutating func pay(_ amount: Int) -> Bool. Un’estensione del protocollo fornisce total(for:) (importo più commissione). Implementa Card (commissione del 2% arrotondata per difetto, ha sempre successo, tiene traccia di payments), Wallet (balance memorizzato, nessuna commissione, fallisce quando il totale supera il saldo, altrimenti lo riduce) e GiftCard (balance memorizzato, nessuna commissione, paga quanto può: se il saldo è insufficiente, rifiuta). Completa checkout(_:with:), che prova ogni metodo di pagamento nell’ordine indicato e restituisce paid 100 with wallet (fee 0) per il primo che ha successo, oppure declined se nessuno ci riesce. Restituisce anche i metodi aggiornati, così che i loro saldi vengano mantenuti tra un acquisto e l’altro.

Il codice fornito legge il saldo del portafoglio e quello della carta regalo, quindi gli importi degli acquisti. Per ogni acquisto prova, nell’ordine, la carta regalo, il portafoglio e la carta, e stampa il risultato, poi i saldi finali.

Il tuo codice va inserito in PaymentMethod.swift, Card.swift, Wallet.swift, GiftCard.swift e Functions.swift. main.swift contiene il codice fornito per input e output e non può essere modificato.

Provalo tu

// Codice di input/output fornito: lascialo così com'è
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)") }
}

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Playground Swift