Swift 柯里化学习笔记

2016-04-14  本文已影响62人  雨生_

最近在学习Swift里面的内容,买了大神王巍的《100个Swift开发必备的Tip》,第一篇就是讲解柯里化知识的,简单学习了一下,记录下学习的内容。
首先,提下概念,在这里我就引用大神的句子了

在Swift中可以将方法进行柯里化,也就是把接收多个参数的方法变换成接受第一个参数的方法,并且返回接收余下的参数,返回结果的新方法。

柯里化的语法中,是将原来一个括号包含多个参数的方法,改写成多个括号的方法,每个括号内写入你希望每次传进来的参数,使用方法时,按照顺序分别传入参数,写一个简单的例子吧

func addThree(num1:Int) (num2:Float) (num3:Double) ->Int{
           return num1 +Int(num2) +Int(num3)
}
let oneNum = addThree(10)
let twoNum = oneNum(2.5)
let result = twoNum(10.25)
print(result)

用playground写下这段代码后,右边的输出框内,显示的结果

按照我个人的理解,每次输入一个数字之后,返回的就是一个方法,除非是所有参数都输入完毕,返回的才是结果(Int),就像我们OC中的[[class alloc]init],相当于执行了两个方法,并且顺序不可以改变,不可能先init在alloc。这里还有一个要注意的是,参数需要按照自己定义方法的参数顺序去输入,否则会报错。

最近的Xcode更新了最新版本,按照之前的语法输入柯里化的语法之后,给予了一个警告,提示我这种语法习惯将会在未来被取消掉。
官方给的介绍是这样的:

Curried function declaration syntax func foo(x: Int)(y: Int)
is of limited usefulness and creates a lot of language and implementation complexity. We should remove it.

意思是用法有局限性,实现过于复杂,将要删除。如果实在需要使用,官方给了一个替代方法。这里贴下代码:

func addThreeNum(num: Int)->(Float)->(Double) -> Int{
    return {
        (num2:Float)->(Double)->Int in
        return{
        (num3:Double)->Int in
            return num + Int(num2) + Int(num3)
        }
    }
}
let addOne = addThree(10)
let addTwo = addOne(num2: 1.2)
let addThree_result = addTwo(num3: 12.3)

官方链接

个人的理解暂且能写出来的就这么多,未完待遇,欢迎指正。

上一篇 下一篇

猜你喜欢

热点阅读