1️⃣ 基本概念对比
| 特性 | for 循环 | map |
|---|---|---|
| 目的 | 遍历集合并执行操作(可以有副作用) | 遍历集合并生成新的集合 |
| 返回值 | 没有返回值(Void) | 返回一个新的数组或集合,长度与原集合一致 |
| 可读性 | 适合复杂逻辑或有多步操作 | 适合纯转换逻辑,代码更简洁 |
| 副作用 | 常用于打印、更新外部变量等 | 通常不用于副作用,更强调函数式风格 |
2️⃣ 语法对比
使用 for 循环:
let numbers = [1, 2, 3, 4, 5]
var squares = [Int]()
for number in numbers {
squares.append(number * number)
}
print(squares) // [1, 4, 9, 16, 25]
使用 map:
let numbers = [1, 2, 3, 4, 5]
let squares = numbers.map { $0 * $0 }
print(squares) // [1, 4, 9, 16, 25]
可以看到,map 写法更加简洁,没有显式声明中间变量,也没有手动 append。
3️⃣ 使用场景
推荐使用 map 的情况:
-
纯转换
当你只是想把一个集合的每个元素转换成另一个值,而不依赖外部状态:let strings = ["1", "2", "3"] let numbers = strings.map { Int($0) } // [Optional(1), Optional(2), Optional(3)] -
追求函数式风格和可读性
map更符合函数式编程思路,让代码可组合、可链式调用:let doubled = [1, 2, 3, 4].map { $0 * 2 }.filter { $0 > 4 } // [6, 8] -
避免手动管理临时数组
使用map可以直接得到新的数组,不需要var和append。
推荐使用 for 循环的情况:
-
有副作用
比如打印日志、更新外部变量、调用函数等:for number in [1, 2, 3] { print(number) } -
复杂逻辑或多步操作
当每个元素需要多步处理或条件判断时,for循环更直观:var results = [Int]() for number in [1, 2, 3, 4] { if number % 2 == 0 { results.append(number * 10) } }
4️⃣ 小结
map→ 生成新集合,无副作用,写法简洁,函数式风格,适合“转换”操作。for→ 可以做任何操作,有副作用,适合复杂逻辑或不返回新集合的情况。
💡 经验法则:
如果只是把数组元素映射成新值 → 用
map
如果涉及复杂逻辑或副作用 → 用for