3-1.【函数式编程】map 与 for 循环在 Swift 中的区别?在什么情况下推荐使用 map?

1 阅读2分钟

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 的情况:

  1. 纯转换
    当你只是想把一个集合的每个元素转换成另一个值,而不依赖外部状态:

    let strings = ["1", "2", "3"]
    let numbers = strings.map { Int($0) } // [Optional(1), Optional(2), Optional(3)]
    
  2. 追求函数式风格和可读性
    map 更符合函数式编程思路,让代码可组合、可链式调用:

    let doubled = [1, 2, 3, 4].map { $0 * 2 }.filter { $0 > 4 } // [6, 8]
    
  3. 避免手动管理临时数组
    使用 map 可以直接得到新的数组,不需要 varappend

推荐使用 for 循环的情况:

  1. 有副作用
    比如打印日志、更新外部变量、调用函数等:

    for number in [1, 2, 3] {
        print(number)
    }
    
  2. 复杂逻辑或多步操作
    当每个元素需要多步处理或条件判断时,for 循环更直观:

    var results = [Int]()
    for number in [1, 2, 3, 4] {
        if number % 2 == 0 {
            results.append(number * 10)
        }
    }
    

4️⃣ 小结

  • map → 生成新集合,无副作用,写法简洁,函数式风格,适合“转换”操作。
  • for → 可以做任何操作,有副作用,适合复杂逻辑或不返回新集合的情况。

💡 经验法则

如果只是把数组元素映射成新值 → 用 map
如果涉及复杂逻辑或副作用 → 用 for