嵌套函数
函数分为全局函数和局部函数,前面已经介绍了全局函数,下面介绍下局部函数,定义在函数体内部的函数可以成为嵌套函数。
注意:嵌套函数对外是隐蔽的,只能在其封闭函数内有效,嵌套函数只能在其封闭函数内有效,其封闭函数也可以返回嵌套函数,以便于程序在其他作用域内使用嵌套函数。
func Math(#type:String)->(Int)->Int
{
func square(val:Int)->Int
{
return val*val
}
func cube(val:Int)->Int
{
return val*val*val
}
switch(type)
{
case "square":
return square
case "cube":
return cube
default:
print("没有该函数")
}
}
var mathFunc=Math(type:"cube")//先得到cube函数,调用权利给mathFunc
print(mathFunc(5))调用cube函数,输出125
var mathFunc=Math(type:"square")//先得到square函数,调用权利给mathFunc
print(mathfunc(5))调用square函数,输出25
闭包
闭包是一种新的语法,跟Object-C的代码块一样,更加灵活性。
其实函数也可以算的上闭包处理
* 全局函数是一个有名称、但不会捕捉任何值的闭包。
* 嵌套函数是一个有名字、可以捕获封闭函数体的值的闭包。
* 闭包表达式是一个简单的、可以捕获封闭函数体的值的匿名闭包。
func Math(#type:String)->Int->Int
{
switch(type)
{
case "square":
return {(val:Int)->Int in
return val*val
}
case "cube":
return {(val:Int)->Int in
return val*val*val
}
default:
print("没有该函数")
}
}
var mathFunc=Math(type:"cube")
print(mathFunc(5))
闭包与嵌套函数存在的区别
* 定义闭包无须func关键字,无须制定函数名。
* 定义闭包需要额外使用in关键字。
* 定义闭包的第一个花括号要移到形参列表的圆括号之前。
标准语法如下:
{
(形参列表)->返回值类型 in
//核心代码
}
闭包的本质是更加灵活的代码块,因此完全可以将闭包赋值给变量或直接调用闭包。
var square={(val:Int)->Int in
return val*val
}
print(square(5))
var result=(#base:Int,#exponent:Int)->Int in
var result = 1
for i in 1...exponent
{
result *=base
}
return result
}(4,3)
print(result)
上面两个闭包函数,第一个是先声明再调用,第二个是声明后直接调用
注意目前Swft中闭包的外部形参名没有任何意义。
几种简化方法
省略形参列表、返回值类型
//使用闭包表达式,由于程序定义square变量的类型
//所以swift可以推断闭包表达式的形参列表、返回值类型
var square:(Int)->Int ={(var) in return val*val}
//省略形参类型后,也可省略形参列表的圆括号,即可简化成
var square:(Int)->Int={var in return val*val}
print(square(5))//输出25
省略return
如果闭包表达式只有一行代码,并且这行代码的返回值将作为闭包表达式的返回值,那么可以省略