前言
第一次接触柯里化感觉这个方法很奇怪,当然奇怪也很正常,毕竟苹果总是不走寻常路的。理解柯里化需要有一定的Swift功底,我尽可能讲的通俗易懂些,希望大家多多支持。
开始之前呢,首先我们来复习一下数学知识:
f(x,y) = x + y; 函数f(x,y)是一个接受两个参数的函数,这个不用解释了,这要是看不懂,接下来就没必要看下去了。
我先给他传一个参数 f(2,y) = 2 + y,这就相当于得到了一个新的函数g(y)=2+y,然后我再给他传一个参数g(3)=2+3=5,最后得到了这个结果5就相当于是f(2,3) = 2 + 3 = 5,只不过我们每次只传一个参数。有人可能看出来了,这不就是Swift中的柯里化吗?没错下面不闲扯了进入正题。
Swift中的柯里化
func addThreeNumber(a:Int)(b:Int)(c:Int) -> Int {
return a+b+c
}
根据OC的语法习惯我们都是这么写的
func addThreeNumber(a:Int,b:Int,c:Int) -> Int {
return a+b+c;
}
但是这两种方法的区别是什么呢,这就相当于f(2,3,4) = 2+3+4 = 9与g(y,z) = f(2,y,z) = 2+y+z -> h(z) = g(3,z) = 2+3+z -> h(4) = 2+3+4 = 9的区别。
第二个函数不多解释了,跟OC中是一样的,柯里化函数我们来看一下它的调用
柯里化方法的调用
let addTowNumber = addThreeNumber(2)// ((b:Int)->(c:Int)-Int)
let addNumber = addTowNumber(b:3) //((c:Int)->Int)
let result = addNumber(c: 4) //int
print("\(result)")//9
我们一步一步来看下这几行代码
let addTowNumber = addThreeNumber(2)
首先这行代码执行完之后函数并未调用,它只是返回了一个接收参数b的函数,并且这个函数又返回一个接收参数c,返回值类型为Int的函数
let addNumber = addTowNumber(b:3)
而这行代码执行完之后它返回的是一个接收参数c,返回值类型为Int的函数
let result = addNumber(c: 4)
最后这行代码执行完之后函数才会调用才会把最终的9返回给result。
打个断点看下具体的代码执行情况:
柯里化方法的实现原理
func add(a: Int) -> (b:Int) -> (c: Int) -> Int {
return { (b:Int) -> (c: Int) -> Int in //这里返回的是一个接收参数b的函数,并且此函数又返回一个接收参数c,返回值类型为Int的函数
return { (c: Int) -> Int in
return a + b + c;
}
}
}
注意
最后需要注意的是柯里化方法的调用必须按照参数的顺序来调用。
柯里化相关文章
Instance Methods are Curried Functions in Swift
函数式编程
如果你对柯里化有一定的了解,Swift应用的也比较熟练可以看下这篇文章
柯里化函数的一个应用是completion handlers
网友评论