Revisão - Calculadora de Formas
Parte da seção Programação Orientada a Objetos do Journey de Swift da Coddy. Lição 36 de 57.
Desafio
DifícilCrie uma calculadora de formas que combine polimorfismo e genéricos. O protocolo Shape exige name, area() e perimeter() (ambos Double). Implemente Rect, Circle (π como 3.14) e Triangle (três lados, área pela fórmula de Heron com sqrt do Foundation). Escreva uma função genérica largest<T>(_ items: [T], by key: (T) -> Double) -> T?. Complete report(_:), que retorna uma linha por forma com duas casas decimais (rect: area 12.00, perimeter 14.00), depois largest area: circle e largest perimeter: rect, ambos encontrados com largest.
O código fornecido lê linhas rect,3,4, circle,2 ou tri,3,4,5, cria [any Shape] e imprime cada linha retornada.
Seu código deve estar em Shape.swift, Rect.swift, Circle.swift, Triangle.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
import Foundation
// Código de entrada/saída fornecido: mantenha-o como está
var input: [String] = []
while let line = readLine() { input.append(line) }
var shapes: [any Shape] = []
for line in input {
let p = line.split(separator: ",").map(String.init)
let v = p.dropFirst().map { Double($0)! }
switch p[0] {
case "rect": shapes.append(Rect(w: v[0], h: v[1]))
case "circle": shapes.append(Circle(r: v[0]))
default: shapes.append(Triangle(a: v[0], b: v[1], c: v[2]))
}
}
for line in report(shapes) { print(line) }
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 LivrosPratique por conta própria: Playground de Swift