柯里化可以认为是在编码过程中发现众多相似的函数定义后,将它们抽象成一个高阶函数,一般来说这个高阶函数接受多个参数,通过控制传入参数可以使高阶函数变形为满足功能需求的低阶函数。swift的柯里化也是其函数式的特点的重要表现之一。
举个例子:
开始我们要编写一个函数输入一个参数返回加1后的结果。
func addOne (num:Int) -> Int {
return num + 1;
}
然后需求增加,我们需要编写一个函数输入一个参数返回其加2后的结果
func addTwo (num:Int) -> Int {
return num + 2;
}
这里就只是1和2的不同,但是我们需要定义两个函数,如果相似需求的增加我们也要相应定义更多的函数。难道我们没有更通用的方法吗?其实使用Currying就能很好的解决上面的问题。我们可以定义一个通用的函数它接受一个与输入数字相加的数,并返回一个函数。返回的函数将接受输入数字本身,然后进行操作。可以我们是先定义一个高阶的函数,然后使用高阶的函数生产出我们需要的函数:
func addTo(_ adder: Int) -> (Int) -> Int {
return { num in
return num + adder
}
}
let addOne = addTo(1) //addOne: Int -> Int
let addTwo = addTo(2) //addTwo: Int -> Int
let oneResult = addOne(3) // oneResult == 4
let twoResult = addTwo(4) // twoResult == 6
可以看出Currying是一种量产相似函数的好方法,它可以避免写出很多重复的代码,也方便了日后的维护。