Revisão - Sistema de Pagamentos
Parte da seção Programação Orientada a Objetos do Journey de Swift da Coddy. Lição 31 de 57.
Desafio
DifícilProjete um sistema de pagamentos com protocolos. PaymentMethod exige name, fee(for amount: Int) -> Int e mutating func pay(_ amount: Int) -> Bool. Uma extensão de protocolo fornece total(for:) (valor mais a taxa). Implemente Card (taxa de 2% arredondada para baixo, sempre tem sucesso, contabiliza payments), Wallet (um balance armazenado, sem taxa, falha quando o total é maior que o saldo; caso contrário, reduz o saldo) e GiftCard (um balance armazenado, sem taxa, paga o que puder: quando o saldo é insuficiente, recusa). Complete checkout(_:with:), que tenta cada método de pagamento na ordem fornecida e retorna paid 100 with wallet (fee 0) para o primeiro que tiver sucesso, ou declined quando nenhum tiver sucesso. Ele também retorna os métodos atualizados para que seus saldos sejam mantidos entre as compras.
O código fornecido lê um saldo de carteira e um saldo de cartão-presente e, em seguida, os valores das compras. Para cada compra, ele tenta o cartão-presente, a carteira e o cartão, nessa ordem, e imprime o resultado e, depois, os saldos finais.
Seu código deve estar em PaymentMethod.swift, Card.swift, Wallet.swift, GiftCard.swift e Functions.swift. main.swift contém o código fornecido de entrada/saída e não pode ser editado.
Experimente você mesmo
// Código de entrada/saída fornecido: mantenha-o 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 as lições de Programação Orientada a Objetos
1Classes e Objetos
Trabalhando com ArquivosDefinindo ClassesMétodos e selfInicializadoresClasses são ReferênciasRevisão - Cartão da Biblioteca4Encapsulamento
Controle de AcessoSomente Leitura ExternaProtegendo o EstadoInicializadores que Podem FalharRevisão - Conta Bancária7Polimorfismo e Genéricos
PolimorfismoConversão de TiposFunções GenéricasTipos GenéricosRevisão - Calculadora de Formas2Structs e Tipos de Valor
StructsSemântica de ValorMétodos MutáveisStruct ou ClasseRecapitulação - Item de Inventário5Herança
SubclassesSobrescrita de métodosInicializadores e superfinal e hierarquiasRecapitulação - Hierarquia de funcionários8Protocolos Padrão
CustomStringConvertibleEquatableComparableHashableRecapitulação - Ordenação Personalizada11Projeto: Gerenciamento de Biblioteca
Livros e MembrosEmpréstimo de Livros3Propriedades em Profundidade
Propriedades ComputadasObservadores de PropriedadesMembros EstáticosEnums com MétodosRecapitulação - Registro de Temperatura6Protocolos
Definindo ProtocolosConformidade de TiposExtensões de ProtocolosProtocolos como TiposRevisão - Sistema de PagamentosPratique por conta própria: Playground de Swift