有趣的
Swift 3
算法。
今天分享几个Swift Higher Order Functions 给大家。
主要是 Filter
、Map
、Reduce
。
Higher Order Functions(高阶函数1 )。
准备
打开XCode,新建Playground,创建WordsWithCharCountDemo。
Filter
目标
[1, 2, 3, 4, 3, 3] -> (filter into) [3, 3, 3] or -> [2, 4](偶数)
实现
我们当然可以通过For循环来完成这样的功能2 ,但是有的时候,我们想要得到的是let
的 不可变的数组,这个时候,我们可以借助filter
函数。
let numbers = [1, 2, 3, 4, 3, 3]
let filtered = numbers.filter({ return $0 == 3})
filtered
在filter函数中我们创建了一个闭包表达式,详细的闭包表达式知识就不在本文中多说了。该表达式完成的工作就是比较传递进来的参数和3的值,相等则返回true
,而filter
则根据判断返回合适的参数值。
同样的,若想得到[2,4]
的话,可以修改闭包表达式,
let filtered = numbers.filter({return $0 % 2 == 0})
Map
目标
用map转换[1, 2, 3, 4] -> [2, 4, 6, 8]
实现
let transformed = [1,2,3,4].map({return $0 * 2})
transformed
依然是利用简化的闭包表达式,返回参数*2。
map 与 filter
这里有必要提一下map与filter的区别。
map意为映射,就是将原有的参数通过某种方式映射成为另一个值;
而filter意为过滤,就是通过一定的条件,将满足该条件的值筛选出来。
Reduce
目标
用reduce实现累加数组 [1, 2, 3, 4]-> 10
实现
let sum = [1,2,3,4].reduce(0, {sum, number in sum+number})
sum
这里reduce
函数的官方定义:
func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, UInt) throws -> Result) rethrows -> Result
联系reduce的意思可以知道,该方法从一序列的数创造出一个单一的值。例如,获取数组中数的和、乘积等。
initialResult
是一个初始化的值,类似于用for
循环时先初始化sum = 0
或者produce = 1
。
闭包表达式中:
两个参数,Result
与 调用reduce
的数组元素,抛出的则是结果,因此是 sum + number
而不是sum = sum + number
。
结束语
这三个函数在理解之后都不难,而且和for循环
相比,相当简洁高效!
感谢看完本文!希望你有所收获!:)
-
A higher-order functional language is one in which a function may be used as a value, just like an integer or a boolean. That is, the value of a variable may be a function, and a function may take a function as argument and may return a function as a result. 一个高阶函数是指该函数可以被当作变量类型一样来使用。就是说变量可能是函数,一个函数可能会把另一个函数作为参数或者返回值是一个函数类型!
-
For循环也可以完成下面要讲的map与reduce,下文就不再提及