Repaso - Calculadora de formas
Parte de la sección Programación orientada a objetos del Journey de Swift de Coddy. Lección 36 de 57.
Desafío
DifícilConstruye una calculadora de figuras que combine polimorfismo y genéricos. El protocolo Shape requiere name, area() y perimeter() (ambos Double). Implementa Rect, Circle (π como 3.14) y Triangle (tres lados, área mediante la fórmula de Herón con sqrt de Foundation). Escribe una función genérica largest<T>(_ items: [T], by key: (T) -> Double) -> T?. Completa report(_:), que devuelve una línea por figura con dos decimales (rect: area 12.00, perimeter 14.00), después largest area: circle y largest perimeter: rect, ambos encontrados con largest.
El código proporcionado lee líneas rect,3,4, circle,2 o tri,3,4,5, construye [any Shape] e imprime cada línea devuelta.
Tu código va en Shape.swift, Rect.swift, Circle.swift, Triangle.swift y Functions.swift. main.swift contiene el código proporcionado de entrada/salida y no se puede editar.
Pruébalo tú mismo
import Foundation
// Código de entrada/salida suministrado: déjalo 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 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 librosPractica por tu cuenta: Playground de Swift