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 中使用高阶函数。您现在有足够的信心在您的代码中使用它们。确保您了解更多关于它们的信息并进行一些实际示例。

更新于:2022-12-09

6000+ 次浏览

启动您的 职业生涯

通过完成课程获得认证

开始
广告
© . All rights reserved.