最近在学习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写下这段代码后,右边的输出框内,显示的结果
- oneNum的显示结果是Float->Double->Int,
- twoNum的显示结果是Double->Int,
-
result显示的是输出结果22,
按照我个人的理解,每次输入一个数字之后,返回的就是一个方法,除非是所有参数都输入完毕,返回的才是结果(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)
个人的理解暂且能写出来的就这么多,未完待遇,欢迎指正。