一、首先我们先了解一下函数的定义。
Swift 定义函数使用关键字 func。定义函数的时候,可以指定一个或多个输入参数和一个返回值类型。每个函数都有一个函数名来描述它的功能。通过函数名以及对应类型的参数值来调用这个函数。函数的参数传递的顺序必须与参数列表相同。函数的实参传递的顺序必须与形参列表相同,-> 后定义函数的返回值类型。其实讲了一大堆函数就是方法。就是项目里要实现一些功能需要的处理逻辑的地方。
二、那么高阶函数有是什么呢?
高阶函数其实也是一个函数,和普通函数的区别就是可以接收函数作为参数,或者返回一个函数来操作其他函数。高阶函数其实看着挺吓人,其实这样的函数我们都见过很多了。在之前其实我也没什么定义在了解后才发现我们项目里的请求接口处理接口返回的数据用到的Map就是高阶函数。
1、Map
对集合进行循环,并对集合中的每个元素采取相同的操作。
map 方法接受一个闭包作为参数, 然后它会遍历整个 numbers 数组,并对数组中每一个元素执行闭包中定义的操作。 相当于对数组中的所有元素做了一个映射。映射是一种特殊的对应关系。打个比方,生活中一只箭可以射中一只鸟,也可以射不中,甚至可以射中几只。但是在程序中,这只箭必须射中一只,而且也只能能射中一只。
正常一点的理解就是:映射就是把两个对象对应起来。对应的对象叫做象,被对应的对象叫做原象。
为了更简单的介绍这个函数,假设我们有一个需求:将[1, 2, 3]转换为["1", "2", "3"],一般情况下我们会这么做: 使用for循环遍历数组,创建一个string类型的空数组append。
但是使用map后代码更简便
我们来看看map的函数的源码
map以一个命名函数transform作为参数,transform负责把元素Element转成类型T并返回一个类型T的数组。说实话当看到方法签名时我懵B了,throws还知道是捕获异常的,表示这个函数可能会抛出异常,无论作为参数的闭包是否抛出异常,那么rethrows又是什么鬼?我查找了资料rethrows表示这个函数本身不会抛出异常,但如果作为参数的闭包抛出了异常,那么它会把异常继续抛上去。也就是说闭包函数没有异常时我们不用去捕获异常,有异常时我们就去处理异常。
2、flatMap
当在序列上实现时:对集合的集合进行平化。
Swift中的flatMap函数的作用就是接受一个闭包作为规则,自动遍历集合的每一个元素,使用闭包的规则去处理这些元素,将处理结果直接放入到一个新的集合里面,可以出现数组降维,并且会自动过滤nil(自动解包),如果是不包含nil元素的一维数组的和map的作用效果是一样的,所以推荐使用flatMap
flatMap和map的区别 : flatMap 方法同 map 方法比较类似,只不过它返回后的数组中不存在 nil(自动把 nil 给剔除掉),同时它会把 Optional 解包。
3、Filter
循环遍历集合并返回包含满足条件的元素的数组。
顾名思义就是用来过滤的,这是Swift 为每个数组提供的一个新式武器,该函数带一个闭包做为参数,这个闭包将数组中的元素作为参数,并返回一个bool结果。数组中的每一个元素都会执行该闭包,根据返回的结果来决定是否应存在于新的数组中
假设有一个数组,接着想要创建一个新的数组,新数组包含原数组中所有大于20的元素,我们可以使用下面的for循环:
使用Filter我们只需要在filter的闭包内做判断条件,满足这个条件的就会返回在一个新的数组内。
func filter(_ isIncluded: (Int) throws -> Bool) rethrows -> [Int]
filter以一个命名函数isIncluded作为参数,isIncluded返回true或者false,对原数组元素Element调用isIncluded时,只有返回true的元素会通过筛选,从而放入返回数组 [Element]中
4、removeAll(where:) — 删除
高效根据条件删除,比filter内存效率高,指定不想要的东西,而不是想要的东西,和filter类似的功能。filter把满足条件的返回到新的数组。不是在操作原数组。removeAll(where:)是操作原数组把满足条件的剔除掉。可根据需求合理选择使用filter和removeAll(where:)
5、Reduce
将集合中的所有项组合起来,以创建一个单一的值。
Reduce接受两个参数,一个初始值,一个用于合并数组元素的闭包。为Reduce提供的闭包中有两个参数,第一个是部分结果,第二个是来自数组的一个元素。闭包会针对每个元素进行逐次调用。
假设我们还有一个需求我们需要把一个数组内的内容转为字符,但是字符中间需要逗号隔开。这种功能我在项目里经常遇见,举个例子很多项目需要接入内容审查的功能。当我创建多个内容时,要一起提交给服务器去审查,服务器要求我们多个内容用逗号隔开。在这里就不用for循环演示了,现学现用用map实现
但是我们这里介绍的是reduce,为什么介绍它来实现这个功能,为了编写更优美、更易于维护的代码,具有更好的可读性。代码不能写的太笼统。使用reduce就很简单了
当然reduce还可实现其他功能。
//使用reduce翻转一个数组
//使用reduce函数找出整形数组中的最大元素