map 与 compactMap
转换元素并移除 nil 值。
map 与 compactMap 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。
什么是映射
map 是一种高阶函数:它接收一个闭包,将其应用于序列中的每个元素,并返回一个包含转换结果的新数组。
- 原集合永远不会被修改
- 结果数量始终等于输入数量
- 元素类型可以改变(例如
Int→String)
简单映射
将数组中的每个数字加倍:
let numbers = [1, 2, 3, 4]
let doubled = numbers.map { $0 * 2 }
print(doubled) // [2, 4, 6, 8]更改元素类型
映射可以将 Int 值转换为 String 值:
let ids = [10, 20, 30]
let labels = ids.map { "ID-\($0)" }
print(labels) // ["ID-10", "ID-20", "ID-30"]使用命名函数进行映射
您可以传入任何签名匹配的函数,而不只是尾随闭包:
let words = ["swift", "map"]
let upper = words.map { $0.uppercased() }
print(upper) // ["SWIFT", "MAP"]映射无法解决的问题
映射会保留每个元素。如果您的转换返回一个可选值(转换可能失败),最终会得到一个类似 [Int?] 的可选值数组,其中充满了必须稍后过滤的 nil 空缺。
这正是 compactMap 要解决的问题。
使用紧凑映射
compactMap 会转换每个元素,并且丢弃所有结果为 nil 的元素,返回一个非可选数组:
let raw = ["1", "2", "x", "4"]
let nums = raw.compactMap { Int($0) }
print(nums) // [1, 2, 4] -- "x" was dropped映射与紧凑映射对比
区别在于 nil 结果是否会保留下来:
let raw = ["1", "x", "3"]
print(raw.map { Int($0) }) // [Optional(1), nil, Optional(3)]
print(raw.compactMap { Int($0) }) // [1, 3]解除集合中的可选值包装
紧凑映射是从可选值数组中移除 nil 的惯用方式:
let maybe: [Int?] = [1, nil, 3, nil, 5]
let clean = maybe.compactMap { $0 }
print(clean) // [1, 3, 5]使用紧凑映射进行解析
一个常见的实际用途:只解析输入中有效的行:
let lines = ["42", "", "hello", "7"]
let values = lines.compactMap { Int($0) }
print(values) // [42, 7]
print(values.reduce(0, +)) // 49组合映射和紧凑映射
您可以将它们串联起来:先用映射整理数据,再用紧凑映射只保留成功结果:
let scores = ["90", "85", "n/a", "70"]
let passed = scores
.compactMap { Int($0) }
.map { $0 >= 80 ? "pass" : "fail" }
print(passed) // ["pass", "pass", "fail"]在可选链上使用紧凑映射
它也非常适合处理可选属性访问:
struct User { let name: String? }
let users = [User(name: "Ann"), User(name: nil), User(name: "Bo")]
let names = users.compactMap { $0.name }
print(names) // ["Ann", "Bo"]快速检查
哪个函数可以在一步之内转换元素并移除 nil 结果?
回顾
您已经学习了两个核心转换函数:
map— 转换每个元素,结果数量等于输入数量compactMap— 转换元素并丢弃nil,非常适合解析和解除可选值包装- 两者都会返回新数组,且永远不会修改源数据
- 将它们串联起来,可以先整理数据,再干净地进行筛选
接下来:使用谓词进行过滤。
常见问题解答
「map 与 compactMap」课时是免费的吗?
是的 — 「map 与 compactMap」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。
「map 与 compactMap」这节课中我会学到什么?
转换元素并移除 nil 值。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Swift Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「map 与 compactMap」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Swift Academy 课中编写并运行代码吗?
能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- map 与 compactMap
- filter 与谓词
- reduce 与 reduce(into:)
- flatMap 与链式操作