0Pricing
Swift Academy · 课时

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 反馈 — 无需本地设置。

此课程中的所有课时

  1. map 与 compactMap
  2. filter 与谓词
  3. reduce 与 reduce(into:)
  4. flatMap 与链式操作
← 返回 Swift Academy