当被问到swift中高阶函数时,别再傻傻无话可说了

2,826 阅读4分钟

相信各位做了很久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 中非常强大的特性之一,它们允许你编写更加灵活和可重用的代码。通过高阶函数,你可以将函数作为参数传递给其他函数,或者从函数中返回函数,从而实现更加复杂的逻辑和抽象。