Menu
Coddy logo textTech

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.

challenge icon

Desafio

Difícil

Projete 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

Pratique por conta própria: Playground de Swift