Menu
CoddyTech

回顾:形状计算器

本课属于 Coddy Swift 学习旅程的“面向对象编程”单元。第 36 课,共 57 课。

challenge icon

挑战

困难

构建一个结合多态和泛型的形状计算器。协议 Shape 要求包含 name、area() 和 perimeter()(两者均为 Double)。实现 Rect、Circle(π 使用 3.14)和 Triangle(包含三条边,使用 Heron 公式和 Foundation 中的 sqrt 计算面积)。编写泛型函数 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) }

面向对象编程中的所有课

自己练习: Swift 在线编辑器