相信各位做了很久iOS开发后,都或多或少了解或者使用过高阶函数(Higher-Order Functions),但是大部分小伙伴知道的高阶函数还只是系统提供的那些内置函数:map、filter、reduce、flatmap、compactMap等。这些高阶函数基本都是基于集合类型的处理的,其实关于高阶函数,我们可以透过现象看本质,你自己也可以自定义一些高阶函数。
在 swift 中,高阶函数是指那些可以接收函数作为参数,或者返回一个函数作为结果的函数。高阶函数提供了一种强大的抽象机制,允许你将函数作为一等公民(first-class citizen)来操作,即函数可以像变量一样被传递和返回。
接收函数作为参数的高阶函数
你可以定义一个高阶函数,该函数接收一个或多个函数作为参数,并在其内部调用这些函数。
// 定义一个高阶函数,接收一个无参数无返回值的函数作为参数
func execute(_ action: () -> Void) {
action()
}
// 定义一个简单的函数,用于测试高阶函数
func sayHello() {
print("Hello, World!")
}
// 调用高阶函数,并传递 sayHello 作为参数
execute(sayHello) // 输出: Hello, World!
在这个例子中,execute 是一个高阶函数,它接收一个类型为 () -> Void 的函数作为参数,即一个没有参数且没有返回值的函数。我们定义了 sayHello 函数,并将其传递给 execute,从而实现了函数的调用。
返回函数作为结果的高阶函数
高阶函数也可以返回一个函数作为结果。这允许你根据某些条件动态地创建和返回不同的函数。
// 定义一个高阶函数,返回一个根据参数返回不同结果的函数
func createGreetingFunction(forName name: String) -> () -> String {
return {
return "Hello, \(name)!"
}
}
// 调用高阶函数,获取一个返回问候语的函数
let greetAlice = createGreetingFunction(forName: "Alice")
let greetBob = createGreetingFunction(forName: "Bob")
// 调用返回的函数
print(greetAlice()) // 输出: Hello, Alice!
print(greetBob()) // 输出: Hello, Bob!
在这个例子中,createGreetingFunction 是一个高阶函数,它接收一个字符串参数 name,并返回一个类型为 () -> String 的函数,即一个没有参数且返回一个字符串的函数。我们调用了 createGreetingFunction 两次,分别获取了 greetAlice 和 greetBob 这两个函数,并调用了它们来输出问候语。
闭包作为高阶函数的参数和返回值
在 swift 中,闭包(closure)是一种特殊的函数,它可以捕获和存储其所在上下文的引用。闭包可以作为高阶函数的参数和返回值。
// 定义一个高阶函数,接收一个闭包作为参数,并返回闭包调用的结果
func processNumbers(_ numbers: [Int], _ operation: (Int, Int) -> Int) -> Int {
var result = numbers[0]
for number in numbers.dropFirst() {
result = operation(result, number)
}
return result
}
// 定义一个简单的加法闭包
let add = { (a: Int, b: Int) -> Int in
return a + b
}
// 调用高阶函数,并传递加法闭包作为参数
let sum = processNumbers([1, 2, 3, 4, 5], add)
print(sum) // 输出: 15
在这个例子中,processNumbers 是一个高阶函数,它接收一个整数数组和一个类型为 (Int, Int) -> Int 的闭包作为参数。闭包 add 实现了加法操作,并将其传递给 processNumbers 函数。函数内部通过迭代数组并使用闭包对元素进行操作,最终返回操作的结果。
swift 标准库中的高阶函数
Swift 的标准库也提供了许多高阶函数,如 map、filter、reduce 等,这些函数通常用于处理集合类型(如数组和字典)。
let numbers = [1, 2, 3, 4, 5]
// 使用 map 函数将每个元素乘以 2
let doubled = numbers.map { $0 * 2 }
print(doubled) // 输出: [2, 4, 6, 8, 10]
// 使用 filter 函数筛选出偶数元素
let evens = numbers.filter { $0 % 2 == 0 }
print(evens) // 输出: [2, 4]
// 使用 reduce 函数计算所有元素的总和
let sum = numbers.reduce(0, +)
print(sum) // 输出: 15
// 使用 flatMap 函数来做集合展平
let nums = [[1,2],[3,4,5],[6,7,8]]
let newNums = nums.flatMap{$0}
print(newNums)// 输出:[1,2,3,4,5,6,7,8]
// 使用 compactMap 函数来处理集合返回一个不含空元素的集合
let arr = [1,2,3,nil,4,nil]
let result = arr.compactMap{$0}
print(result) // 输出:[1,2,3,4]
高阶函数是 Swift 中非常强大的特性之一,它们允许你编写更加灵活和可重用的代码。通过高阶函数,你可以将函数作为参数传递给其他函数,或者从函数中返回函数,从而实现更加复杂的逻辑和抽象。