Rückblick – Zahlungssystem
Teil des Abschnitts Objektorientierte Programmierung der Swift-Journey von Coddy. Lektion 31 von 57.
Aufgabe
SchwerEntwirf ein Zahlungssystem mit Protokollen. PaymentMethod erfordert name, fee(for amount: Int) -> Int und mutating func pay(_ amount: Int) -> Bool. Eine Protokollerweiterung stellt total(for:) bereit (Betrag plus Gebühr). Implementiere Card (Gebühr von 2 %, abgerundet, immer erfolgreich, zählt payments), Wallet (ein gespeichertes balance, keine Gebühr, schlägt fehl, wenn der Gesamtbetrag höher als das Guthaben ist, andernfalls wird es reduziert) und GiftCard (ein gespeichertes balance, keine Gebühr, bezahlt, was möglich ist: Wenn das Guthaben zu niedrig ist, wird die Zahlung abgelehnt). Vervollständige checkout(_:with:), das jede Zahlungsmethode in der angegebenen Reihenfolge ausprobiert und für die erste erfolgreiche Methode paid 100 with wallet (fee 0) zurückgibt oder declined, wenn keine erfolgreich ist. Es gibt außerdem die aktualisierten Methoden zurück, damit ihre Guthaben zwischen den Käufen erhalten bleiben.
Der bereitgestellte Code liest ein Wallet-Guthaben und ein Geschenkkarten-Guthaben und anschließend die Kaufbeträge ein. Für jeden Kauf versucht er zuerst die Geschenkkarte, dann das Wallet und schließlich die Karte und gibt das Ergebnis sowie anschließend die endgültigen Guthaben aus.
Dein Code gehört in PaymentMethod.swift, Card.swift, Wallet.swift, GiftCard.swift und Functions.swift. main.swift enthält den bereitgestellten Eingabe-/Ausgabecode und darf nicht bearbeitet werden.
Probier es selbst
// Gelieferter Ein-/Ausgabecode: belasse ihn wie er ist
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)") }
}
Alle Lektionen in Objektorientierte Programmierung
1Klassen und Objekte
Arbeiten mit DateienKlassen definierenMethoden und selfInitialisiererKlassen sind ReferenzenRückblick – Bibliotheksausweis4Kapselung
ZugriffskontrolleVon außen schreibgeschütztZustand schützenFehlschlagende InitialisiererRückblick – Bankkonto7Polymorphismus und Generika
PolymorphismusTypumwandlungGenerische FunktionenGenerische TypenZusammenfassung – Shape-Rechner2Strukturen und Werttypen
StrukturenWertsemantikVerändernde MethodenStruktur oder KlasseZusammenfassung – Inventarelement5Vererbung
UnterklassenMethoden überschreibenInitialisierer und superfinal und HierarchienRückblick – Mitarbeiterhierarchie8Standardprotokolle
CustomStringConvertibleEquatableComparableHashableRückblick – Benutzerdefiniertes Sortieren11Projekt: Bibliotheksverwaltung
Bücher und MitgliederBücher ausleihen3Eigenschaften im Detail
Berechnete EigenschaftenEigenschaftsbeobachterStatische MemberEnums mit MethodenRückblick – Temperaturprotokoll6Protokolle
Protokolle definierenTypen konform machenProtokollerweiterungenProtokolle als TypenRückblick – ZahlungssystemÜbe selbstständig: Swift-Playground