一. Currying解释
- currying 翻译为局部套用.又称为部分求值(Partial Evaluation), 是一种函数式编程思想,在Swfit4.0的 时候已经废弃了函数的柯里化. 函数的 currying 特性的使用场景并不大,但他会增加很多语言的复杂性,所以需要删除它,但是柯里化函数式编程思想还是很重要的.
- 特点:
只用“表达式”(表达式:单纯的运算过程,总是有返回值),不用“语句”(语句:执行某种操作,没有返回值)。2.不修改值,只返回新值。
- 好处:
代码简洁
提高代码复用性
代码管理方便,相互之间不依赖,每个函数都 是一个独立的模块,很容易进行单元测试。
易于“并发编程”,因为不修改变量的值,都是返回新值。
最大的好处就是能把函数当参数用!!
二. 代码示例
需求: 需要三个函数.
- 第一个函数,在自身上+1.
- 第一个函数,在自身上+2.
- 第一个函数,在自身上+3.
func addTo(_ adder : Int) -> (Int) -> Int {
return {
num in
return num + adder
}
}
// 使用
let addOne = addTo(1000)
let result_one = addOne(1)
print(result_one)
/**
addTo(1000) 返回一个闭包 (Int) -> Int
num in 的意思是: 用in把参数和方法隔开. num就是闭包的入参(Int)
该闭包里面执行的是 return num + adder.
*/
// 这是一个字符串的示例
func strAppends(_ a : String) -> (String) -> String {
return {
b in
return a + b
}
}
将一个普通的三个入参的函数转化为柯里化函数
func add(a: Int, b: Int, c: Int) -> Int{
print("\(a) + \(b) + \(c)")
return a + b + c
}
func add(_ a: Int) -> (Int) -> (Int) -> Int{
return {
b in
return {
c in
a + b + c
}
}
}
// 使用
let one = add(1)
let result = one(2)(3)
print(result)
没有返回值的
func printString(_ month : Int) -> (Int) -> (String) -> Void {
return {
day in
return {
action in
print("\(month)月" + "\(day)日" + "\(action)")
}
}
}
// 使用
printString(8)(25)("我想找个对象")
// 输出: 8月25日我想找个对象