译者:candeladiao(github地址),欢迎将精彩内容分享到CocoaChina。
原文:Higher Order Functions: Map,Filter,Reduce and more – Part 1
闭包介绍
Swift一大特性便是使用简洁的头等函数/闭包语法代替了复杂的blocks语法。希望我们在Swift中不再需要像fuckingblocksyntax中所描述的语法。(译者注:头等函数-即可将函数当作参数传递给其他的函数,或从其他的函数里返回出值,并且可以将他们设定为变量,或者将他们存储在数据结构中)
闭包是自包含的blocks,它能在代码中传递和使用。
本文我们将重点介绍匿名定义的闭包(如:定义成内联的且不具名)也称匿名闭包。我们能够将其作为参数传递给其他函数/方法或者将其作为返回值。闭包是极其强大的语言特性,它能够使我们编写程序的时候更快,更容易,更少出错。
Blocks/闭包(同一概念的不同命名)在Cocoa和Cocoa Touch中广泛使用,是iOS框架的核心。
让我们来看一些闭包例子以及它们为什么如此有用:
假设我们需要两个函数,其中一个计算两个数的平方的平均值,另一个计算两个数的立方的平均值,传统的解决方法会是这样:
1
2
3
4
5
6
7
8
9
10
11
12
|
funcsquare(a:Float)->Float{
return
a*a
}
funccube(a:Float)->Float{
a*a*a
}
funcaverageSumOfSquares(a:Float,b:Float)->Float{
(square(a)+square(b))/2.0
}
funcaverageSumOfCubes(a:Float,b:Float)->Float{
(cube(a)+cube(b))/2.0
}
|
我们注意到averageSumOfSquares和averageSumOfCubes的唯一不同只是分别调用平方函数或立方函数。如果我能够定义一个通用函数,这个函数以两个数和一个使用这两个数的函数作为参数,来计算平均值而不是重复调用将会非常好,我们可以使用闭包作为函数参数
funcaverageOfFunction(a:Float,b:Float,f:(Float->Float))->Float{
(f(a)+f(b))/2
averageOfFunction(3,4,square)
这里我们使用了命名闭包,我们也可以使用闭包表达式定义一个没有名称的内联闭包。
|