swift高阶函数

129 阅读2分钟
本文已参与新人创作礼活动,一起开启掘金创作之路。

什么是高阶函数

如果一个函数:

  • 接收一个或多个函数当作参数
  • 把一个函数当作返回值

至少满足以上条件中的一个的函数,那么这个函数就被称作高阶函数。

使用高阶函数进行函数式编程的优势

  • 简化代码
  • 使逻辑更加清晰
  • 当数据比较大的时候,高阶函数会比传统实现更快,因为它可以并行执行(如运行在多核上)



swift有哪些高阶函数 mapflatMapcompactMapfilterreduce

map

数组中每个元素通过某种规则(闭包实现) 进行转换,最后返回一个新的数组

a. 需求:将Int类型数组中的元素乘以2,然后转换为String类型的数组

**


let ints = [1, 2, 3, 4]

let strs = ints.map { "($0 * 2)" }

// 打印结果:["2", "4", "6", "8"]

print(strs)

b. 需求:生成一个新的Int数组,元素是多少元素就重复多少个

**


let nums = [1, 2, 3, 4]

let mapNums = nums.map { Array(repeating: $0, count: $0) }

// 打印结果:[[1], [2, 2], [3, 3, 3], [4, 4, 4, 4]]

print(mapNums)

最终返回的是一个二维数组。

c. 需求:将String类型的数组转换为Int类型的数组

**


let someAry = ["12", "ad", "33", "cc", "22"]

// var nilAry: [Int?]

let nilAry = someAry.map { Int($0) }

// 打印结果:[Optional(12), nil, Optional(33), nil, Optional(22)]

print(nilAry)

最终返回的是[Int?],一个可选类型的Int数组,且元素中存在nil

flatMap

flatMap的实现与map非常类似,也是数组中每个元素通过某种规则(闭包实现) 进行转换,最后返回一个新的数组。

不过flatMap能把数组中存有数组的数组(二维数组、N维数组)一同打开变成一个新的数组,称为降维,通俗一点就是把多维数组都会拍扁为一维数组,通过后面的例子一看就明白了。

flatMap另一个解包的功能在 4.1 版本之后更名为compactMap,所以在compactMap再做说明。

a. 需求:将Int类型数组中的元素乘以2,然后转换为String类型的数组

**


let ints = [1, 2, 3, 4]

let strs = ints.flatMap { "($0 * 2)" }

// flatMap打印结果:["2", "4", "6", "8"]

print(strs)

该例子使用的与map一样,结果也是一样的,普通情况下,两者的效果一致。

b. 需求:生成一个新的Int数组,元素是多少元素就重复多少个

**


let nums = [1, 2, 3, 4]

let mapNums = nums.flatMap { Array(repeating: $0, count: $0) }

// flatMap打印结果:[1, 2, 2, 3, 3, 3, 4, 4, 4, 4]

print(mapNums)

可以看到,flatMap把数组中的数组都打开了,最终返回的是一个一维数组。而map返回的是一个二维数组,没有降维。

compactMap

compactMap是在4.1之后对flatMap的一个重载方法的重命名,同样是数组中每个元素通过某种规则(闭包实现) 进行转换,最后返回一个新的数组,不过compactMap会将nil剔除,并对Optional进行解包。

a. 需求:将String类型的数组转换为Int类型的数组

**


var someAry = ["12", "ad", "33", "cc", "22"]

// var compactMapAry: [Int]

var compactMapAry = someAry.compactMap { Int($0) }

// compactMap打印结果:[12, 33, 22]

print(compactMapAry)

最终返回的是[Int],一个Int数组,并将其中转换失败的nil过滤掉了,并对转换成功的Optional值进行了解包。

filter

filter用来过滤元素,即筛选出数组元素中满足某种条件(闭包实现) 的元素。

a. 需求:筛选出Int数组中的偶数

**


let nums = [1, 13, 12, 36, 77, 89, 96]

let result = nums.filter { $0 % 2 == 0 }

// 打印结果:[12, 36, 96]

print(result)

最终返回的是全部是偶数的Int数组。

reduce

计算,可以对数组的元素进行计算