Swift 高阶函数介绍

117 阅读2分钟

在 Swift 中,高阶函数(Higher-Order Functions)  是指能够接受闭包作为参数或返回闭包作为结果的函数。它们常用于集合类型(如 ArraySetDictionary)的操作,能简化代码并提高可读性。以下是 Swift 中常用的高阶函数及其详细说明:


1. map

作用:对集合中的每个元素进行转换,返回一个包含转换结果的新集合。
语法

func map<T>(_ transform: (Element) -> T) -> [T]

参数

  • transform:一个闭包,接受集合元素并返回转换后的值。

示例

let numbers = [1, 2, 3]
let squared = numbers.map { $0 * $0 } // [1, 4, 9]

2. filter

作用:筛选出满足条件的元素,返回一个新集合。
语法

func filter(_ isIncluded: (Element) -> Bool) -> [Element]

参数

  • isIncluded:返回 Bool 的闭包,决定元素是否被保留。

示例

let numbers = [1, 2, 3, 4, 5]
let evenNumbers = numbers.filter { $0 % 2 == 0 } // [2, 4]

3. reduce

作用:将集合元素合并为一个值(如求和、拼接字符串等)。
语法

func reduce<Result>(
    _ initialResult: Result,
    _ nextPartialResult: (Result, Element) -> Result
) -> Result

参数

  • initialResult:初始值。
  • nextPartialResult:合并当前结果和元素的闭包。

示例

let numbers = [1, 2, 3]
let sum = numbers.reduce(0) { $0 + $1 } // 6
// 简写形式:numbers.reduce(0, +)

4. compactMap

作用:对元素进行转换,并自动过滤掉结果为 nil 的项。
语法

func compactMap<T>(_ transform: (Element) -> T?) -> [T]

示例

let strings = ["1", "2", "apple"]
let numbers = strings.compactMap { Int($0) } // [1, 2]

5. flatMap

作用

  • Swift 4 之前:将嵌套集合“扁平化”为一维数组,同时支持可选值转换。
  • Swift 4+ :仅用于扁平化嵌套集合(可选值处理由 compactMap 代替)。

语法

func flatMap<T>(_ transform: (Element) -> [T]) -> [T]

示例

let nestedArray = [[1, 2], [3, 4]]
let flattened = nestedArray.flatMap { $0 } // [1, 2, 3, 4]

6. forEach

作用:遍历集合元素,类似 for-in 循环,但无返回值。
语法

func forEach(_ body: (Element) -> Void)

示例

["a", "b", "c"].forEach { print($0) }

7. sorted

作用:根据闭包的排序条件返回一个新的有序数组。
语法

func sorted(by areInIncreasingOrder: (Element, Element) -> Bool) -> [Element]

示例

let numbers = [3, 1, 2]
let sortedDesc = numbers.sorted(by: >) // [3, 2, 1]

8. contains

作用:判断集合是否包含满足条件的元素。
语法

func contains(where predicate: (Element) -> Bool) -> Bool

示例

let numbers = [1, 2, 3]
let hasEven = numbers.contains { $0 % 2 == 0 } // true

9. prefix / suffix

作用

  • prefix:返回满足条件的前几个元素,直到条件不满足为止。
  • suffix:返回从末尾开始的满足条件的元素(需先反转集合)。

语法

func prefix(while predicate: (Element) -> Bool) -> [Element]
func suffix(_ maxLength: Int) -> [Element] // 非高阶函数版本

示例

let numbers = [1, 2, 3, 4, 5]
let prefix = numbers.prefix { $0 < 4 } // [1, 2, 3]

10. first(where:) / last(where:)

作用:查找第一个/最后一个满足条件的元素。
语法

func first(where predicate: (Element) -> Bool) -> Element?
func last(where predicate: (Element) -> Bool) -> Element?

示例

let numbers = [1, 2, 3, 4, 5]
let firstEven = numbers.first { $0 % 2 == 0 } // 2

11. removeAll(where:)

作用:原地移除所有满足条件的元素(Swift 5.2+)。
语法

mutating func removeAll(where shouldBeRemoved: (Element) -> Bool)

示例

var numbers = [1, 2, 3, 4, 5]
numbers.removeAll { $0 % 2 == 0 } // numbers 变为 [1, 3, 5]

高阶函数组合示例

let numbers = [1, 2, 3, 4, 5]
let result = numbers
    .filter { $0 % 2 == 0 }  // [2, 4]
    .map { $0 * 10 }          // [20, 40]
    .reduce(0, +)             // 60

总结

函数作用返回值类型
map元素转换新数组
filter筛选元素新数组
reduce合并元素任意类型
compactMap转换并过滤 nil新数组(非可选)
flatMap扁平化嵌套集合一维数组
forEach遍历元素
sorted排序新数组
contains判断条件是否满足Bool

通过灵活组合这些高阶函数,可以极大简化集合操作代码,提升开发效率