Swift函数柯里化介绍及使用场景
函数柯里化是函数式编程里的一个重要概念。swift中的柯里化可能很多人都没有了解过,今天给大家介绍一下柯里化的概念和一些使用场景。
定义
柯里化(Currying)是从数学里借用过来的编程语言技法(基于20世纪Haskell Curry等数学家的研究成果)。柯里化指的是从一个多参数函数变成一连串单参数函数的变换。它描述的是变换的过程,不涉及变换之后对函数的调用。调用者可以决定对多少个参数实施变换,余下的部分将衍生为一个参数数目较少的新函数。这个新的函数接收剩下的参数,其内部则指向原始函数。当提供的参数完整了才会最终执行原始函数。
语法
<pre><code>
//普通函数定义
func mutiply(x:Int,y:Int)->Int{
return x*y
}
//柯里化形式
func mutiply(x:Int)(y:Int)->Int{
return x*y
}
</code></pre>
使用如下:
<pre><code>
let twice=mutiply(2)
let result=twice(y: 5) //result等于10
//如果直接在一行里调用就这样写
let result2=mutiply(2)(y: 6)
</code></pre>
例子里的twice的类型是一个闭包,可以粗暴的理解为mutiply的两个参数第一个参数x已经有了个默认值2,twice的参数就是剩下的另一个参数y。
两个细节
- 只有一个参数,并且这个参数是该函数的第一个参数。必须按照参数的定义顺序来调用柯里化函数。
- 柯里化函数的函数体只会执行一次,只会在调用完最后一个参数的时候执行柯里化函数体
应用场景
-
函数工厂
想象下面向对象编程里的工厂方法。如果有一个工厂返回的是函数,那就正适合柯里化了。
adder通过柯里化把第一个参数固定为1,返回了一个+1的函数。
-
隐含参数
当我们需要频繁调用一个函数,而每次参数的值都差不多的时候,可以运用柯里化来设置隐含参数。
我们有个连接数据库的方法connectDB,参数是数据库名称和用户,这是一个通用的方法。但是数据库的环境只有测试和正式两个环境,所以利用柯里化生成好连接两个数据库的方法,隐藏了数据库名称这个参数。
这里其实还可以更进一步,用状态模式封装connectDB,这样外面不用关心当前的环境。
要强调的一个思维的转化是,函数式编程思想,思考的单位不再是对象,而是函数。使用上的区别是,在某个方法里,如果需要这样一个函数,只需要一个声明,外面传递进来。至于这个函数在哪个对象上实现的不需要关心。和面向接口编程更配哦。
欢迎关注我的微博:@没故事的卓同学