Swift 中的高阶函数是什么?
在本教程中,您将学习 Swift 中可用的高阶函数。您将了解它们的用途以及如何使用它们。
它们是什么?
高阶函数是指将一个或多个函数作为参数,或者返回一个函数作为其结果的函数。以下是 Swift 语言提供的高阶函数:
forEach()
map()
compactMap()
flatMap()
filter()
reduce()
sort()
sorted()
所有高阶函数都基于闭包,但不用担心,您不需要成为闭包大师。它们易于使用,还可以减小项目中代码的体积。
为什么要使用它们?
您确实可以不用高阶函数也能做到同样的事情。但是,在代码中使用高阶函数,您可以避免实现 Swift 语言中以非常优化的方式已经提供的函数。
在这里,我们将通过示例查看所有函数。每个函数都将结合实际示例进行详细讨论。
forEach()
它将迭代集合(例如数组)中的所有元素,但不返回任何内容。请记住,您不能在 forEach 函数中使用 continue 和 break 来退出当前正在执行的语句。
ForEach 函数类似于 for-in 循环,区别在于您不能在 forEach 函数中使用 continue 和 break 语句。
示例
let numbersInWord = ["One", "Two", "Three", "Four", "Five", "Six"]
numbersInWord.forEach {
element in print(element)
}
输出
One Two Three Four Five Six
解释
在上面的示例中,您可以看到 forEach 函数正在迭代所有元素。当您想要迭代所有元素而不中断执行流程时,最好使用 forEach()。
map()
map 函数的工作原理是对集合的所有元素执行操作,并返回包含该操作结果的新集合。
此函数旨在将对象从一种类型转换为另一种类型(以及同一类型)。
示例 1
let numbers = [1, 2, 3, 4, 5, 6, 7]
let numbersInString = numbers.map {
number in String(number)
}
print("numbersInString: \(numbersInString)")
输出
numbersInString: ["1", "2", "3", "4", "5", "6", "7"]
解释
在上面的示例中,您使用 map 函数将每个 Int 转换为 String。您可以看到映射所有输入元素有多么容易。
无论如何,我们可以使用简写参数 $0 来减少此表达式,$0 指的是数组的任何元素。以下是一个示例:
示例 2
let lowercasedNumbers = ["one", "two", "three", "four"]
let uppercasedNumbers = lowercasedNumbers.map({ $0.uppercased() })
print("uppercasedNumbers: \(uppercasedNumbers)")
输出
uppercasedNumbers: ["ONE", "TWO", "THREE", "FOUR"]
解释
在上面的示例中,我们使用了 $0,它表示简写参数名称,用于访问闭包块内的元素。在这里,$0 将为您提供当前参数的值。
compactMap()
compactMap() 迭代数组中的元素,仅返回一个更新后的数组,其中只包含满足其主体中声明的条件的元素。该数组将被更新,其中不包含任何导致 nil 值的元素。
因此,compactMap 循环遍历数组中的所有元素并返回非 nil 值。
示例
let numbersInString = ["1", "x2", "3", "4", nil, "five5"]
let validNumbers = numbersInString.compactMap {
stringValue in
Int(stringValue ?? "")
}
print("validNumbers: \(validNumbers)")
输出
validNumbers: [1, 3, 4]
解释
在上面的示例中,生成的数组将不包含任何 nil 值。生成的数组保证具有非 nil 值。
flatMap()
flatMap 函数允许我们将一组数组转换为包含所有元素的单个集合。
示例
这是一个包含其他数组作为元素的数组。假设每个内部数组包含学生三门不同课程的成绩:
let marks = [[3, 4, 5], [2, 5, 3], [1, 2, 2], [5, 5, 4], [3, 5, 3]]
现在我们必须组合所有分数并将结果放入单个数组中。
我们可以执行 for-in 循环并将每个数组的所有元素附加到结果数组中。但是,如果 Swift 语言提供了 flatMap 函数,为什么还需要手动执行此操作呢?它需要更少的精力,并且经过优化。
let marks = [[3, 4, 5], [2, 5, 3], [1, 2, 2], [5, 5, 4], [3, 5, 3]]
let allMarks = marks.flatMap {
marksArray -> [Int] in
marksArray
}
print("allMarks: \(allMarks)")
输出
allMarks: [3, 4, 5, 2, 5, 3, 1, 2, 2, 5, 5, 4, 3, 5, 3]
filter()
filter() 将迭代数组中的所有元素,并将仅返回一个更新后的数组,其中包含满足 filter 主体内部编写的条件的元素。
在 Swift 中,它始终是一个必不可少的函数。在编写代码时,您经常需要过滤集合以根据条件生成过滤后的集合。
闭包的返回类型为 Bool 值;结果数组中的项目是满足主体内部条件的那些项目;
示例
let numbers = [-12, 23, -1, 56, 9, -2, 0, 14, 8]
let positives = numbers.filter {
number in
number > 0
}
print("positives: \(positives)")
输出
positives: [23, 56, 9, 14, 8]
reduce()
reduce 函数将迭代数组中的所有元素,并返回一个包含所有元素组合值的對象。
示例
let numbers = [1, 5, 2, 10, 6]
let sum = numbers.reduce(0) {
(result, number) -> Int in
result + number
}
print("sum:", sum)
输出
sum: 24
解释
上面,第一个参数是前一次计算的结果,它将添加到数值中。您可以理解 reduce 函数背后的逻辑如下:
// 1st iteration: result = 0, number = 1, Return 1 // 2nd iteration: result = 1, number = 5, Return 6 // 3rd iteration: result = 6, number = 2, Return 8 // 4th iteration: result = 8, number = 10, Return 18 // 5th iteration: result = 18, number = 6, Return 24
sort() & sorted()
sort 函数将根据闭包主体中编写的条件对所有元素进行排序。
sorted 函数将根据闭包主体中编写的条件对所有元素进行排序,并返回一个新的已排序数组。
sort()
示例
var numbers = [1, 5, 2, 10, 6]
numbers.sort()
print("Sorted numbers: \(numbers)")
输出
Sorted numbers: [1, 2, 5, 6, 10]
解释
在上面的示例中,我们初始化了一个包含未排序数字的变量。我们必须在不使用任何其他变量或常量的情况下对它们进行排序。在这种情况下,我们使用 sort() 函数在同一变量内对元素进行排序。
请注意,我们可以在变量上使用 sort(),而不是在常量上使用 sort(),因为 sort() 使用相同的变量对元素进行排序。
sorted()
示例
let numbers = [1, 5, 2, 10, 6]
let sortedArray = numbers.sorted()
print("sortedArray:", sortedArray)
输出
sortedArray: [1, 2, 5, 6, 10]
解释
此函数对元素进行排序并返回一个新的已排序数组。
结论
本文演示了如何在 Swift 中使用高阶函数。您现在有足够的信心在您的代码中使用它们。确保您了解更多关于它们的信息并进行一些实际示例。
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP