10.2 闭包的概念
在Swift中,可以通过以下代码替代9.6节中的示例代码。
func calculate(opr :String)-> (Int,Int)-> Int {
var result : (Int,Int)-> Int
switch (opr) {
case "+" :
result = {(a:Int, b:Int) -> Int in ①
return a + b
}
default:
result = {(a:Int, b:Int) -> Int in ②
return a - b
}
}
return result
}
let f1:(Int,Int)-> Int = calculate("+")
println("10 + 5 = \(f1(10,5))")
let f2:(Int,Int)-> Int = calculate("-")
println("10 + 5 = \(f2(10,5))")
原来的嵌套函数add
和sub
被表达式①和②替代。整理出来就是以下两种形式:
{(a:Int, b:Int) -> Int in //替代函数add
return a + b
}
{(a:Int, b:Int) -> Int in //替代函数sub
return a – b
}
事实上我们还可以把它们写成一行,如下所示:
{(a:Int, b:Int) -> Int in return a + b } //替代函数add
{(a:Int, b:Int) -> Int in return a - b } //替代函数sub
可以看到代码①和②的表达式就是Swift中的闭包表达式。
通过以上示例的演变,我们可以给Swift 中的闭包一个定义:闭包是自包含的匿名函数代码块,可以作为表达式、函数参数和函数返回值,闭包表达式的运算结果是一种函数类型。
Swift中的闭包类似于C和Objective-C 中的代码块、C++和C#中的Lambda
表达式、Java中的匿名内部类。
Swift中的闭包可以捕获和存储其所在上下文环境中的常量和变量。这种引用事实上会引起比较麻烦的内存管理问题,好在Swift不需要程序员管理内存。