前言
在Swift中,有关于Array的高阶函数。这一点和JavaScript是一样的。也就是说,Swift也是支持函数式编程的。
关于Array有以下几个高阶函数:filter
map
reduce
flatMap
compactMap
。其中前三个和JavaScript语言是一样的,不同的是语法不同而已。下面我们就来探索一下这5个高阶函数。掌握了这些高阶函数,可以让我们对于一些关于数组处理更加得心应手。
实践
- filter函数:过滤,将数组中的元素按照一定的条件进行过滤 返回过滤后新数组
- 传入函数/闭包表达式
- 该函数/闭包表达式会执行n次,n代表数组中元素个数
- 该函数/闭包表达式 必须返回Bool类型
- 该函数/闭包表达式 接收一个参数,该参数就是每次遍历的数组中元素
- 如果函数/闭包表达式返回值是true 就把该元素放入新的数组
- 如果函数/闭包表达式返回值是false 该元素就会被过滤掉
let array = [1, 2, 3, 4]
let newArray = array.filter { (n) -> Bool in
return n % 2 == 0
}
print(newArray) // [2, 4]
// 利用Swift语言的语法糖 上面的代码还可以进行进一步的简化
let newArray = array.filter { $0 % 2 == 0 }
print(newArray) // [2, 4]
- map函数:将数组中元素进行映射处理,返回处理过后的新数组
- 传入函数/闭包表达式
- 该函数/闭包表达式会执行n次,n代表数组中元素个数
- 该函数/闭包表达式接收一个参数,该参数就是每次遍历的数组元素
- 该函数/闭包表达式返回处理后的内容,将处理后的内容添加到新的数组中(映射操作)
let array = [1, 2, 3, 4]
let newArray = array.map { n in
return n * 2
}
print(newArray) // [2, 4, 6, 8]
// 简写
let newArray = array.map { $0 * 2 }
print(newArray) // [2, 4, 6, 8]
- reduce函数:应用场景:汇总或者数组中每个元素的值和前一个值有关联的处理
- 传入初始值和一个函数/闭包表达式
- 该函数/闭包表达式会执行n次,n代表数组中元素个数
- 该函数/闭包表达式接收2个参数,上一次遍历汇总的结果,和数组中的元素
- 将汇总的结果作为返回值返回
let array = [1, 2, 3, 4]
let result = array.reduce(0) { (previousResult, n) in
return previousResult + n
}
print(result) // 10
// 简写
let result = array.reduce(0) { $0 + $1 }
print(result) // 10
- flatMap:和
map
对比着来理解- flatMap传入的函数/闭包表达式 必须返回sequence类型
- 最终的返回值将sequence中的元素放入到新的数组中
- 而map传入的函数/闭包表达式 直接将数组作为元素放入到新的数组中
let array = [1, 2, 3, 4]
let newArray = array.map { n in
return Array(repeating: n, count: n)
}
print(newArray) // [[1], [2, 2], [3, 3, 3], [4, 4, 4, 4]]
let newArray2 = array.flatMap { n in
return Array(repeating: n, count: n)
}
print(newArray2) // [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
// 简写
let newArray = array.flatMap { Array(repeating: $0, count: $0) }
print(newArray) // [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
- compactMap:和
map
对比着理解- compactMap在进行元素映射的时候,会将nil过滤掉,并且会将可选项进行解包
let array = ["1", "flutter", "3", "Vue"]
let newArray = array.map { item in
return Int(item)
}
print(newArray) // [Optional(1), nil, Optional(3), nil]
let newArray2 = array.compactMap { item in
return Int(item)
}
print(newArray2) // [1, 3]
// 简写
let newArray = array.compactMap { Int($0) }
print(newArray) // [1, 3]