有趣的 Swift 3 算法。

今天分享几个Swift Higher Order Functions 给大家。 主要是 FilterMapReduce

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循环相比,相当简洁高效!
感谢看完本文!希望你有所收获!:)

  1. 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. 一个高阶函数是指该函数可以被当作变量类型一样来使用。就是说变量可能是函数,一个函数可能会把另一个函数作为参数或者返回值是一个函数类型!

  2. For循环也可以完成下面要讲的map与reduce,下文就不再提及