10.2 闭包的概念

在Swift中,可以通过以下代码替代9.6节中的示例代码。

  1. func calculate(opr :String)-> (Int,Int)-> Int {
  2. var result : (Int,Int)-> Int
  3. switch (opr) {
  4. case "+" :
  5. result = {(a:Int, b:Int) -> Int in
  6. return a + b
  7. }
  8. default:
  9. result = {(a:Int, b:Int) -> Int in
  10. return a - b
  11. }
  12. }
  13. return result
  14. }
  15. let f1:(Int,Int)-> Int = calculate("+")
  16. println("10 + 5 = \(f1(10,5))")
  17. let f2:(Int,Int)-> Int = calculate("-")
  18. println("10 + 5 = \(f2(10,5))")

原来的嵌套函数addsub被表达式①和②替代。整理出来就是以下两种形式:

  1. {(a:Int, b:Int) -> Int in //替代函数add
  2. return a + b
  3. }
  4. {(a:Int, b:Int) -> Int in //替代函数sub
  5. return a b
  6. }

事实上我们还可以把它们写成一行,如下所示:

  1. {(a:Int, b:Int) -> Int in return a + b } //替代函数add
  2. {(a:Int, b:Int) -> Int in return a - b } //替代函数sub

可以看到代码①和②的表达式就是Swift中的闭包表达式。

通过以上示例的演变,我们可以给Swift 中的闭包一个定义:闭包是自包含的匿名函数代码块,可以作为表达式、函数参数和函数返回值,闭包表达式的运算结果是一种函数类型。

Swift中的闭包类似于C和Objective-C 中的代码块、C++和C#中的Lambda表达式、Java中的匿名内部类。

Swift中的闭包可以捕获和存储其所在上下文环境中的常量和变量。这种引用事实上会引起比较麻烦的内存管理问题,好在Swift不需要程序员管理内存。