Currying
Currying就是把一个多参数的方法,拆解为只有第一个参数的方法,这个方法的返回值不是一个具体的值,而是一个新的方法,这个方法的参数是原先的方法刨去第一个参数后的“剩下的方法的片段”,可以理解为,把一个多参数方法只作为某一种模板
基本写法
基本结构:
func function name (parameters)(parameters)->return type{
statements
}
func add(originValue: Int)(inputValue: Int) -> Int {
return originValue + inputVlue
}
这个写法就是 currying 函数的基本写法,originValue 是他的固定的基数(或者说基础参数). inputValue是以后调用的不同的输入值.基础参数构建了一个类似模板的东西,而输入值构建了我们想要的最终结果.
使用:
let addWith10 = add(10)
let addWith100 = add(100)
以上,分别构建了一个以 10 和100 为基数的方法.它们都是新的方法,但是是我们最开始方法的一部分,如果要使用:
let result1 = addWith10(inputValue: 1)
let result2 = addWith100(inputValue: 1)
result1的结果是 11
result2的结果是 101
以上就是 Currying 的一个小剖析,下面我们从一般函数入手,看看Currying到底是怎么演化的.
从函数开始
func sum(a: Int,b: Int) -> Int {
return a + b
}
sum(1, 2) //输出3
这是一个非常简单的函数,如果用 Currying 的写法,会变成:
func sum(a: Int)(b: Int) -> Int {
return a + b
}
var sumByFirst = sum(1)
sumByFirst(b: 4) //输出5
只需要传入第一个参数,返回的sumByFirst是一个函数,它包含剩余的其他参数,以及刚刚传入进去的那个1,接着以它自己作为方法传入第二个参数b就行了。
如果是三个参数就像这样:
func sum(a: Int)(b: Int)(c: Int) -> Int {
return a + b + c
}
var sumByFirst = sum(1)
var sumBySecond = sumByFirst(b: 4)
sumBySecond(c: 10) //输出15
除了第一个参数以外,其他的参数都要显式地写上参数标签,并且要按参数排列的顺序调用。
一个括号中放两个参数也可以:
func sum(a: Int)(b: Int, c: Int) -> Int {
return a + b + c
}
var sumByFirst = sum(1)
sumByFirst(b: 4,c: 10) //输出15
在某些情况下,你可能会用某个相同的参数重复调用某个方法,那么利用柯里化会使代码更易于维护:
func sum(a: Int)(b: Int) -> Int {
return a + b
}
var sumWithFive = sum(5)
sumWithFive(b: 5)
sumWithFive(b: 10)
sumWithFive(b: 15)
因为 Swift 的 Selector 只能通过字符串生成,这会面临一个很严重的问题,就是难以重构,并且无法在编译期间进行检查,这是非常危险的行为.但是利用方法的 Currying ,我们可以解决这个问题.