Menu
Coddy logo textTech

復習 - 図形計算機

CoddyのSwiftジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 36/57。

challenge icon

チャレンジ

難しい

ポリモーフィズムとジェネリクスを組み合わせた図形計算機を作成してください。プロトコル Shape は、name、area()、perimeter()(どちらも Double)を要求します。Rect、Circle(πには 3.14 を使用)、Triangle(3辺を持ち、面積はFoundationの sqrt を使ったヘロンの公式で計算)を実装してください。ジェネリック関数 largest<T>(_ items: [T], by key: (T) -> Double) -> T? を記述してください。report(_:) を完成させます。この関数は、各図形について小数点以下2桁の1行(rect: area 12.00, perimeter 14.00)を返し、その後に largest area: circle と largest perimeter: rect を続けます。後者の2つは、どちらも 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) }

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Swiftプレイグラウンド