乐闻世界logo
搜索文章和话题

Swift 中的高阶函数有哪些?如何使用 map、filter、reduce?

2月21日 15:04

Swift 中的高阶函数有哪些?如何使用 map、filter、reduce 等函数式编程特性?

Swift 提供了丰富的高阶函数,支持函数式编程范式。这些函数可以接受其他函数作为参数或返回函数,使代码更加简洁和声明式。

主要的高阶函数:

  1. map:

    • 对集合中的每个元素应用转换函数
    • 返回包含转换后元素的新数组
    • 保持原始集合不变
    • 示例:
      swift
      let numbers = [1, 2, 3, 4, 5] let doubled = numbers.map { $0 * 2 } // [2, 4, 6, 8, 10] let names = ["alice", "bob", "charlie"] let capitalized = names.map { $0.capitalized } // ["Alice", "Bob", "Charlie"]
  2. filter:

    • 根据条件筛选集合中的元素
    • 返回包含满足条件元素的新数组
    • 示例:
      swift
      let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] let evenNumbers = numbers.filter { $0 % 2 == 0 } // [2, 4, 6, 8, 10] let words = ["apple", "banana", "pear", "grape"] let longWords = words.filter { $0.count > 4 } // ["apple", "banana"]
  3. reduce:

    • 将集合中的元素组合成单个值
    • 接受初始值和组合函数
    • 示例:
      swift
      let numbers = [1, 2, 3, 4, 5] let sum = numbers.reduce(0) { $0 + $1 } // 15 let product = numbers.reduce(1) { $0 * $1 } // 120 let names = ["Alice", "Bob", "Charlie"] let allNames = names.reduce("") { $0 + $1 + " " } // "Alice Bob Charlie "
  4. flatMap:

    • 对集合中的每个元素应用转换函数,并展平结果
    • 处理嵌套数组或可选值
    • 示例:
      swift
      let numbers = [[1, 2], [3, 4], [5, 6]] let flattened = numbers.flatMap { $0 } // [1, 2, 3, 4, 5, 6] let optionalNumbers: [Int?] = [1, nil, 3, nil, 5] let nonNilNumbers = optionalNumbers.flatMap { $0 } // [1, 3, 5]
  5. compactMap:

    • 类似于 map,但过滤掉 nil 值
    • 专门用于处理可选值
    • 示例:
      swift
      let strings = ["1", "2", "three", "4", "five"] let numbers = strings.compactMap { Int($0) } // [1, 2, 4]
  6. forEach:

    • 对集合中的每个元素执行操作
    • 不返回新值
    • 示例:
      swift
      let numbers = [1, 2, 3, 4, 5] numbers.forEach { print($0) }
  7. sorted:

    • 对集合进行排序
    • 可以自定义排序规则
    • 示例:
      swift
      let numbers = [5, 2, 8, 1, 9] let ascending = numbers.sorted { $0 < $1 } // [1, 2, 5, 8, 9] let descending = numbers.sorted { $0 > $1 } // [9, 8, 5, 2, 1]

链式调用:

swift
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] let result = numbers .filter { $0 % 2 == 0 } .map { $0 * $0 } .reduce(0) { $0 + $1 } // 220 (2² + 4² + 6² + 8² + 10²)

最佳实践:

  1. 优先使用高阶函数而非 for 循环
  2. 合理使用链式调用提高代码可读性
  3. 注意性能影响,避免过度嵌套
  4. 使用有意义的变量名提高代码清晰度
  5. 在复杂逻辑中使用传统循环提高可维护性
标签:Swift