首先了解闭包之前先要了解
嵌套函数
。
嵌套函数是一种在较复杂函数中方便进行命名和定义自包含代码模块的方式。嵌套函数是闭包最简单的形式。
定义在函数体中的函数,称为嵌套函数(nested functions)。
默认情况下,嵌套函数是对外是不可见的,但可以被封闭他们的函数(enclosing function)调用。封闭函数可以返回它的一个嵌套函数,使这个函数在其他域中可以被使用。
//以下是一个嵌套函数的例子 func GetMathfunc(type:String)->(Int)->Int //定义该函数的返回类型为(Int)->Int,并根据参数选择返回不同的嵌套函数 { func square(val:Int)->Int { return val*val } func cube(val:Int)->Int { return val*val*val } func factorial(val:Int)->Int { var result = 1; for index in 2...val { result*=index } return result } //定义了三个嵌套函数 switch(type) { case "square": return square case "cube": return cube default: return factorial } } var mathFunc = GetMathfunc(type: "cube") //调用mathFunc函数的时候返回的不是一个具体的值,而是一个函数cube的指针,这个指针指向变量mathFunc,所以mathFunc此时等同于cube函数,下面另外两个函数同理 print(mathFunc(5))//125 mathFunc = GetMathfunc(type: "square") print(mathFunc(5))//25 mathFunc = GetMathfunc(type: "factorial") print(mathFunc(5))//120 |
闭包表达式
Swift提供了简洁的闭包表达式来创建闭包
{(形参列表) -> 返回值类型 in
//零条到多条的可执行语句 }
//定义一个计算平方的闭包表达式 var square = {(val: Int) -> Int in return val*val } |
调用闭包
var square = {(val: Int)->Int in
return val*val } print(square(5)) //25 print(square(3)) //9
//闭包被赋值给square变量,因此程序可以通过调用该变量来调用该闭包
//第二种调用形参方式 var result = {(a:Int,b:Int)->Int in return a*b }(2,3) print(result)//6 /* *这种调用方式没有将闭包赋值给任何变量而是在定义闭包的同时调用该闭包 *闭包后面的圆括号(2,3)直接调用闭包并且直接传入对应的参数 *所以result的不是方法而是值 */ |
Swift的闭包表达式还拥有简洁的风格,并鼓励在常见场景中以实现语法优化,主要优化有下面几种:
- 利用上下文推断参数和返回值类型
- 单表达式(single-expression)闭包可以省略 return 关键字
- 参数名称简写
- Trailing 闭包语法