标签:
文章内容来自《Functional Programing in Swift》,具体内容请到书中查阅
Map, Filter, Reduce
Functions that take functions as arguments are sometimes called higher- order functions.
higher-order function(高阶函数)就是说函数可以作为另一个函数的参数。
在本章,我们将介绍一下swift标准库中在数组方面的一些相关的高阶函数,先介绍一些比较普通的然后介绍如何把这些泛型的操作组织成一个比较复杂的操作。
Introducing Generics (泛型)
// 函数:返回 对原来的数组的每个元素进行加1后的数组
func incrementArray(xs: [Int]) -> [Int] { var result: [Int] = [] for x in xs { result.append(x + 1) } return result }
// 函数:返回 对原来的数组的每个元素进行乘2后的数组
func doubleArray1(xs: [Int]) -> [Int] { var result: [Int] = [] for x in xs { result.append(x * 2) } return result }
你会发现这两个方法中有很多相似的代码,能够将这些不同的地方抽象出来,写成一个单一,更普通的函数的方式么?就如下面:
func computeIntArray(xs: [Int]) -> [Int] { var result: [Int] = [] for x in xs { result.append(/* something using x */) } return result }
为了完成上面的定义,我们将需要一个新的参数用来抽象出这些不同的地方:
func computeIntArray(xs: [Int], f: Int -> Int) -> [Int] { var result: [Int] = [] for x in xs { result.append(f(x)) } return result }
那么之前的代码将变成下面:
func doubleArray2(xs: [Int]) -> [Int] { return computeIntArray(xs) { x in x * 2 } }
注意在调用computeIntArray的时候,我们使用过了尾闭包(trailing closures )语法
但是这个computeIntArray还不是很灵活,如果我们支持计算一个数组中的元素是不是偶数:
func isEvenArray(xs: [Int]) -> [Bool] { computeIntArray(xs) { x in x % 2 == 0 } }
不幸的是,这段代码会报一个类型错误。那么我们该如何解决呢?或许我们会这样做:
func computeBoolArray(xs: [Int], f: Int -> Bool) -> [Bool] { let result: [Bool] = [] for x in xs { result.append(f(x)) } return result }
但是这样还是不好,假如我们需要计算的是String?难道我们要定义另外一个高阶函数,参数类型为 Int->String ?
we will say "NO"
幸好,这有解决办法:我们可以使用泛型 (generics):
func genericComputeArray<U>(xs: [Int], f: Int -> U) -> [U] { var result: [U] = [] for x in xs { result.append(f(x)) } return result }
但是你会发现我们这边还是有个[Int],so:
func map<T, U>(xs: [T], f: T -> U) -> [U] { var result: [U] = [] for x in xs { result.append(f(x)) } return result }
下面我们对上面的一个函数进行改造:
func computeIntArray<T>(xs: [Int], f: Int -> T) -> [T] { return map(xs, f) }
标签:
原文地址:http://www.cnblogs.com/Ohero/p/4694608.html