Swift中的高阶函数是指那些能够接收函数作为参数、返回函数作为结果,或者两者兼有的函数
map
作用:对集合中的每个元素应用一个给定的闭包,并返回一个新集合,包含所有应用闭包后的结果。
示例:将数组中的每个字符串元素转换为大写。
let strings = ["apple", "banana", "cherry"]
let uppercasedStrings = strings.map { $0.uppercased() }
print(uppercasedStrings) // 输出: ["APPLE", "BANANA", "CHERRY"]
let cast = ["Vivien", "Marlon", "Kim", "Karl"]
let lowercaseNames = cast.map { $0.lowercased() }
// 'lowercaseNames' == ["vivien", "marlon", "kim", "karl"]
let letterCounts = cast.map { $0.count }
// 'letterCounts' == [6, 6, 3, 4]
filter
作用:从集合中筛选出满足特定条件的元素,并返回一个新集合。
示例:从数组中筛选出长度大于5的字符串。
let strings = ["apple", "banana", "cherry", "date"]
let longStrings = strings.filter { $0.length > 5 }
print(longStrings) // 输出: ["banana"]
reduce
作用:将集合中的元素通过某种操作(如求和、拼接等)合并成一个单一的值。
示例:计算数组中所有元素的总和
let letters = "abracadabra"
let letterCount = letters.reduce(into: [:]) { counts, letter in
counts[letter, default: 0] += 1
}
// letterCount == ["a": 5, "b": 2, "r": 2, "c": 1, "d": 1]
let numbers = [1, 2, 3, 4]
et numberSum = numbers.reduce(0, { x, y in
x + y
})
// numberSum == 10
sorted
作用:对集合中的元素进行排序,并返回一个新的有序集合。可以提供一个闭包来自定义排序逻辑。
示例:对字符串数组按字典序逆序排序。
let students: Set = ["Kofi", "Abena", "Peter", "Kweku", "Akosua"]
let sortedStudents = students.sorted()
print(sortedStudents)
// Prints "["Abena", "Akosua", "Kofi", "Kweku", "Peter"]"
To sort the elements of your sequence in descending order, pass the greater-than operator (`>`) to the `sorted(by:)` method.
let descendingStudents = students.sorted(by: >)
print(descendingStudents)
// Prints "["Peter", "Kweku", "Kofi", "Akosua", "Abena"]"
compactMap(Swift 4.1+中替代了flatMap的某些用途)
作用:类似于map,但它会过滤掉nil值,只保留非nil的结果。
示例:从字符串数组中移除空字符串并转换为整数(如果可能)。
let strings = ["1", "2", "", "4", "five"]
let numbers = strings.compactMap { Int($0) }
print(numbers) // 输出: [1, 2, 4]
let possibleNumbers = ["1", "2", "three", "///4///", "5"]
let mapped: [Int?] = possibleNumbers.map { str in Int(str) }
// [1, 2, nil, nil, 5]
let compactMapped: [Int] = possibleNumbers.compactMap { str in Int(str) }
// [1, 2, 5]
forEach
作用:对集合中的每个元素执行指定的操作,但不像map和filter那样返回新集合,而是直接对原集合中的元素进行操作。
示例:遍历数组并打印每个元素
let numberWords = ["one", "two", "three"]
for word in numberWords {
print(word)
}
// Prints "one"
// Prints "two"
// Prints "three"
numberWords.forEach { word in
print(word)
}
// Same as above
first
作用:对集合中的每个元素执行指定的操作,配合 where进行使用
示例:遍历数组满足条件是跳出
let numbers = [3, 7, 4, -2, 9, -6, 10, 1]
if let firstNegative = numbers.first(where: { $0 < 0 }) {
print("The first negative number is \(firstNegative).")
}// Prints "The first negative number is -2."
链式功能
高阶函数也是可以将多个函数应用于同一个数组来生成一个复杂的、自定义的操作序列。
下面是一个使用上述高阶函数进行链式调用的例子,它从一个字符串数组中开始,筛选出长度大于3的字符串,将它们转换为大写,最后计算这些大写字符串的总长度。
let strings1 = ["apple", "banana", "cherry", "date", "elderberry"]
let totalLength = strings1.filter{ $0.count > 3 } // 筛选出长度大于3的字符串
.map({$0 + "SVW"}) // 将筛选出的字符串转都拼接一个SVW
.map{ $0.uppercased() } // 将筛选出的字符串转换为大写
.reduce(into: 0, {$0 += $1.count}) / 计算所有大写字符串的总长度
print(totalLength) // 输出: 46
这些高阶函数是Swift语言中非常强大和灵活的工具,能够大大简化代码,并提高代码的可读性和可维护性。它们可以单独使用,也可以组合使用,形成复杂的数据处理流程。
在编码过程中, 希望大家尽可能使用高阶函数, 让代码变得更加简洁大方










网友评论