Riepilogo - Sistema di pagamento
Fa parte della sezione Programmazione orientata agli oggetti del percorso Swift di Coddy. Lezione 31 di 57.
Sfida
DifficileProgetta 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
1Classi e oggetti
Lavorare con i fileDefinire le classiMetodi e selfInizializzatoriLe classi sono riferimentiRiepilogo - Tessera della biblioteca4Incapsulamento
Controllo degli accessiSola lettura dall’esternoProteggere lo statoInizializzatori che possono fallireRiepilogo - Conto bancario7Polimorfismo e tipi generici
PolimorfismoCasting dei tipiFunzioni genericheTipi genericiRipasso - Calcolatore di forme2Struct e tipi valore
Le structSemantica dei valoriMetodi mutantiStruct o classeRiepilogo - Articolo di inventario5Ereditarietà
SottoclassiSovrascrivere i metodiInizializzatori e superfinal e gerarchieRiepilogo - Gerarchia dei dipendenti8Protocolli standard
CustomStringConvertibleEquatableComparableHashableRiepilogo - Ordinamento personalizzato11Progetto: Gestione della biblioteca
Libri e utentiPrestito dei libri3Le proprietà in dettaglio
Proprietà calcolateObserver delle proprietàMembri staticiEnum con metodiRiepilogo - Registro delle temperature6Protocolli
Definire i protocolliTipi conformiEstensioni dei protocolliProtocolli come tipiRiepilogo - Sistema di pagamentoEsercitati da solo: Playground Swift