Menu
Coddy logo textTech

Ripasso - Calcolatore di forme

Fa parte della sezione Programmazione orientata agli oggetti del percorso Swift di Coddy. Lezione 36 di 57.

challenge icon

Sfida

Difficile

Crea un calcolatore di forme che combina polimorfismo e generici. Il protocollo Shape richiede name, area() e perimeter() (entrambi Double). Implementa Rect, Circle (π come 3.14) e Triangle (tre lati, area calcolata con la formula di Erone usando sqrt da Foundation). Scrivi una funzione generica largest<T>(_ items: [T], by key: (T) -> Double) -> T?. Completa report(_:), che restituisce una riga per forma con due decimali (rect: area 12.00, perimeter 14.00), poi largest area: circle e largest perimeter: rect, entrambi trovati con largest.

Il codice fornito legge righe rect,3,4, circle,2 o tri,3,4,5, crea [any Shape] e stampa ogni riga restituita.

Il tuo codice va inserito in Shape.swift, Rect.swift, Circle.swift, Triangle.swift e Functions.swift. main.swift contiene il codice di input/output fornito e non può essere modificato.

Provalo tu

import Foundation

// Codice di input/output fornito: lascialo così com'è
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) }

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Playground Swift