Swift 柯里化(Currying)

前言

第一次接触柯里化感觉这个方法很奇怪,当然奇怪也很正常,毕竟苹果总是不走寻常路的。理解柯里化需要有一定的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。
打个断点看下具体的代码执行情况:

Swift 柯里化(Currying)_第1张图片
1.jpeg
2.gif

柯里化方法的实现原理

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

你可能感兴趣的:(Swift 柯里化(Currying))