Menu
CoddyTech

compactMap

本课属于 Coddy Swift 学习旅程的“逻辑与流程”单元。第 28 课,共 56 课。

compactMap 是一种会过滤掉可选值的 map。闭包可以返回 Optional,compactMap 会丢弃结果为 nil 的项,并解包其余结果。

let strings = ["3", "hi", "7", "!", "1"]
let numbers = strings.compactMap { Int($0) }
print(numbers)               // [3, 7, 1]

Int("hi") 会返回 nil,因为它无法从 "hi" 中解析出数字。compactMap 会自动丢弃这些值,并给你一个干净的 [Int]。

没有它,你需要写 strings.map { Int($0) },得到一个混有 nil 的 [Int?],然后还得自己把它们筛选出来。compactMap 一次就能完成这两个步骤。

challenge icon

挑战

简单

读取一行输入:由整数和无效文本组成、以逗号分隔的混合内容(有些条目无法解析)。

输出:

  1. 整数(按输入顺序排列),并用 , 连接
  2. 被丢弃的条目数量(无法解析的条目)
  3. 解析出的整数之和

对于输入 3,hi,7,!,1,42,oops,输出为:

3,7,1,42
3
53

亲手试试

let parts = readLine()!.components(separatedBy: ",")

// TODO:用 compactMap 转成整数;打印拼接结果、丢弃的数量和总和
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: Swift 在线编辑器