Menu
Coddy logo textTech

Repaso: sistema de pagos

Parte de la sección Programación orientada a objetos del Journey de Swift de Coddy. Lección 31 de 57.

challenge icon

Desafío

Difícil

Diseña un sistema de pagos con protocolos. PaymentMethod requiere name, fee(for amount: Int) -> Int y mutating func pay(_ amount: Int) -> Bool. Una extensión del protocolo proporciona total(for:) (importe más comisión). Implementa Card (comisión del 2 % redondeada hacia abajo, siempre tiene éxito, cuenta payments), Wallet (un balance almacenado, sin comisión, falla cuando el total es mayor que el saldo; de lo contrario, lo reduce) y GiftCard (un balance almacenado, sin comisión, paga lo que puede: cuando el saldo es demasiado pequeño, rechaza el pago). Completa checkout(_:with:), que prueba cada método de pago en el orden indicado y devuelve paid 100 with wallet (fee 0) para el primero que tiene éxito, o declined cuando ninguno lo consigue. También devuelve los métodos actualizados para que sus saldos se mantengan entre compras.

El código proporcionado lee un saldo de cartera y un saldo de tarjeta regalo, y después los importes de las compras. Para cada compra, prueba la tarjeta regalo, la cartera y la tarjeta en ese orden e imprime el resultado y, después, los saldos finales.

Tu código debe ir en PaymentMethod.swift, Card.swift, Wallet.swift, GiftCard.swift y Functions.swift. main.swift contiene el código proporcionado de entrada/salida y no se puede editar.

Pruébalo tú mismo

// Código de entrada/salida suministrado: déjalo tal como está
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)") }
}

Todas las lecciones de Programación orientada a objetos

Practica por tu cuenta: Playground de Swift