美文网首页IOSiOS笔记iOS Developer
Swift 柯里化(Currying)

Swift 柯里化(Currying)

作者: 槛内浊物 | 来源:发表于2015-12-13 10:49 被阅读286次

    前言

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

    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)

        本文链接:https://www.haomeiwen.com/subject/jttuhttx.html