构建管道
本课属于 Coddy Swift 学习旅程的“逻辑与流程”单元。第 31 课,共 56 课。
你学过的这些方法,map、filter、reduce、compactMap、flatMap、sorted(by:),是日常使用的 Swift 工具集。实际代码会把它们串联起来。
struct Order {
let item: String
let qty: Int
}
let orders = [Order(item: "apple", qty: 3), Order(item: "bread", qty: 0), Order(item: "milk", qty: 5)]
let names = orders
.filter { $0.qty > 0 }
.sorted { $0.qty > $1.qty }
.map { $0.item }
print(names) // ["milk", "apple"]从上到下阅读这个链式操作:保留非空订单,按数量降序排序,然后只保留名称。
每个步骤只负责一件事时,管道会更好用。如果你发现自己在一个闭包里同时做两件事(映射和筛选),就把它们拆成两个步骤。这样链条变长时仍然清晰易读。
挑战
中等读取一行输入:由逗号分隔的 name:price:qty 条目列表。部分条目格式错误,应跳过:价格或数量不是有效整数的条目。
构建一个处理流程,为每个 有效 且满足 qty > 0 的条目生成一行,按总额(price * qty)降序排列,格式如下:
<name>: <total>每个条目的输出行之后,再打印一行汇总:Sum: <n>,其中包含总计。
对于输入 apple:3:2,bread:bad:1,milk:4:5,cheese:8:0,salt:2:7,输出为:
milk: 20
salt: 14
apple: 6
Sum: 40亲手试试
let entries = readLine()!.components(separatedBy: ",")
// TODO:用 compactMap(解析)、filter(qty > 0)构建处理流程,
// 再用 sorted(按 total 降序)、map(格式化);打印各行和 Sum
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Swift 在线编辑器