前言
前段时间在iOS技术群里面有人提到柯里化,当时有点懵,也没有管。最近项目不紧张了,决定来研究研究。顺便和大家分享一下我对Currying的理解。
什么是柯里化函数?
柯里化,又称部分求值,是一种函数式编程思想,就是把接收多个参数的函数转换成接收一个单一参数的函数,并且返回一个接受余下参数的新函数技术。
柯里化函数的运用
举个简单的例子,下面的函数简单的将输入的数加1:
func addOne(num : Int) -> Int {
return num + 1
}
上面这个函数满足我们的需求,实现了将输入的值加1,但是如果要实现加2,加3,加n呢。这个时候我们需要定义一个通用的函数。有人可能想到传入2个参数的方式去实现,比如说:
func add(num1 : Int, num2 : Int) -> Int {
return num1 + num2
}
当然这种方法是可以的,但是我要向大家推荐的是另一种写法,那就是用函数式编程的思想去解决,也是定义一个函数,这个函数它将接收需要与数字相加的数,并返回一个函数,返回的函数将接收输入数字本身,然后进行操作:
func addTo(adder: Int)-> Int -> Int {
return {
num in
return num + adder
}
}
let addTwo = addTo(2)//实现一个数加2 ,这里就是接收需要相加的数字,并且返回一个函数 Int -> Int
let result = addTwo(4)//返回的函数将接收输入的数字,也就是我们这里的4.然后进行操作返回结果
print(result)//6
如果没有swift开发经验的话,可能看到这里会有点懵,那下面我将换一种简单明了的写法,顺便分享一下它的实现原理:
//定义一个接收参数num1,返回一个接收参数num2 的函数,并且这个函数的返回值是为Int类型的函数
func add(num1 : Int) -> (num2 : Int) -> Int {
//一个接收参数num2的函数,并且有返回结果为Int类型的函数
return { (num2: Int) -> Int in
return num1 + num2
}
}
使用柯里化函数的注意事项
1、必须按照参数的定义顺序来调用,否则容易报错
2、柯里化函数的函数体只会被执行一次,只会在调用完最后一个参数的时候执行柯化里函数体,这个可以打断点调试。
//不会调用柯里化函数
let addTwo = addTo(2)//实现一个数加2 ,这里就是接收需要相加的数字,并且返回一个函数 Int -> Int
print(addTwo)//(Function)
//执行柯里化函数体
let result = addTwo(4)//返回的函数将接收输入的数字,也就是我们这里的4.然后进行操作返回结果
print(result)//6
柯里化函数的优点
1、代码简洁
2、提高了代码的复用率
3、每个函数都是一个单独的模块,很容易进行单元测试
4、不用修改原来的值,因为返回的都是新的值
柯里化函数的实用性
1、实用性一:复用性
需求1:地图类产品,很多界面都有相同的功能模块,比如搜索框。
我们可以利用柯里化函数,来组装界面,把界面分成一个个小模块,这样其他界面有相同的模块,直接运用模块代码,去重新组装下就好了。
2、实用性二:延迟性,柯里化函数代码需要前面的方法调用完成之后,才会来到柯里化函数代码中。
需求2:阅读类产品,一个界面的显示,依赖于数据,需要加载完数据之后,才能判断界面显示。
网友评论