Menu
Coddy logo textTech

Rückblick – Zahlungssystem

Teil des Abschnitts Objektorientierte Programmierung der Swift-Journey von Coddy. Lektion 31 von 57.

challenge icon

Aufgabe

Schwer

Entwirf 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

Übe selbstständig: Swift-Playground