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.
Desafío
DifícilDiseñ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
1Clases y objetos
Trabajar con archivosDefinir clasesMétodos y selfInicializadoresLas clases son referenciasRepaso: tarjeta de biblioteca4Encapsulación
Control de accesoSolo lectura desde fueraProtección del estadoInicializadores que pueden fallarRepaso - Cuenta bancaria7Polimorfismo y genéricos
PolimorfismoConversión de tiposFunciones genéricasTipos genéricosRepaso - Calculadora de formas2Structs y tipos por valor
StructsSemántica de valoresMétodos mutablesStruct o claseRepaso - elemento del inventario5Herencia
SubclasesSobrescritura de métodosInicializadores y superfinal y jerarquíasRepaso: jerarquía de empleados8Protocolos estándar
CustomStringConvertibleEquatableComparableHashableRepaso - Ordenamiento personalizado11Proyecto: Gestión de bibliotecas
Libros y miembrosPréstamo de libros3Propiedades en profundidad
Propiedades calculadasObservadores de propiedadesMiembros estáticosEnumeraciones con métodosRepaso - Registro de temperatura6Protocolos
Definición de protocolosTipos conformesExtensiones de protocolosProtocolos como tiposRepaso: sistema de pagosPractica por tu cuenta: Playground de Swift