Повторение — калькулятор фигур
Часть раздела Объектно-ориентированное программирование путешествия по Swift на Coddy. Урок 36 из 57.
Задание
СложноСоздайте калькулятор фигур, объединяющий полиморфизм и обобщения. Протокол Shape требует наличия name, area() и perimeter() (оба имеют тип Double). Реализуйте Rect, Circle (π как 3.14) и Triangle (три стороны, площадь по формуле Герона с использованием sqrt из Foundation). Напишите обобщённую функцию largest<T>(_ items: [T], by key: (T) -> Double) -> T?. Завершите реализацию report(_:), которая возвращает по одной строке для каждой фигуры с двумя знаками после запятой (rect: area 12.00, perimeter 14.00), а затем строки largest area: circle и largest perimeter: rect, обе найденные с помощью largest.
Предоставленный код считывает строки rect,3,4, circle,2 или tri,3,4,5, создаёт [any Shape] и выводит каждую возвращённую строку.
Ваш код должен находиться в файлах Shape.swift, Rect.swift, Circle.swift, Triangle.swift и Functions.swift. В main.swift находится предоставленный код ввода/вывода, и его нельзя редактировать.
Попробуйте сами
import Foundation
// Предоставленный код ввода/вывода: оставьте его как есть
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) }
Все уроки раздела Объектно-ориентированное программирование
1Классы и объекты
Работа с файламиОпределение классовМетоды и selfИнициализаторыКлассы — это ссылкиПовторение — читательский билет4Инкапсуляция
Контроль доступаТолько чтение извнеЗащита состоянияИнициализаторы с возможностью сбояПовторение — банковский счёт7Полиморфизм и обобщения
ПолиморфизмПриведение типовОбобщённые функцииОбобщённые типыПовторение — калькулятор фигур10Паттерны проектирования. Часть 2
Паттерн делегированияПаттерн декораторПаттерн строительПаттерн состояния2Структуры и типы-значения
СтруктурыСемантика значенийИзменяющие методыСтруктура или классПовторение — элемент инвентаря5Наследование
ПодклассыПереопределение методовИнициализаторы и superfinal и иерархииПовторение — иерархия сотрудников8Стандартные протоколы
CustomStringConvertibleEquatableComparableHashableПовторение — пользовательская сортировка11Проект: Управление библиотекой
Книги и читателиВыдача книгПотренируйтесь самостоятельно: Песочница Swift