五.嵌套函数
1. Swift还支持在函数体内定义函数,这种在函数体内定义的函数称为嵌套函数
2.默认情况下,嵌套函数对外部是隐藏的。嵌套函数只能在其封闭函数内有效,其封闭函数也可以返回嵌套函数类型,以便程序在其他作用域中使用嵌套函数。----举个栗子:重新改写得到square函数或其他函数的例子
//定义函数,该函数的返回值类型为(Int)-> Int
func getMathFunc(#type : String) -> (Int) -> Int
{
//定义一个计算平方的函数
func square(val : Int) -> Int
{
return val * val
}
//定义计算立方的函数
func cube(val : Int) -> Int
{
return val * val * val
}
//定义一个计算阶乘的函数
func factorial(val : Int) -> Int
{
int result = 1;
for index in 2...val
{
result *= index
}
return result
}
//该函数返回的是嵌套函数
switch(type)
{
case "square":
return square
case "cube":
return cube
default:
retun factorial
}
}
//调用函数getMathFunc后,该函数返回的是一个函数
var fun1 = getMathFunc(type : "square") //得到square函数
var fun2 = getMathFunc(type : "cube") //得到cube函数
var fun3 = getMathFunc(type : "other") //得到factorial函数
六.嵌套函数与闭包
1.闭包是现代编程语言争相引入的一种语法,如果说函数是命名,方便复用的代码块,那么闭包则是功能更灵活的代码块,它可以在程序中被传递和调用。
2. swift中的闭包类似于Objective-C中的代码块和Java、c#中的Lambda表达式。
3.从另一个角度看,函数也可以被当成闭包进行处理:
(1)全局函数是一个有名称、但不会捕获任何值的闭包
(2)嵌套韩式是一个有名字、可以捕获封闭函数体的值的闭包
(3)闭包表达式则是一个简洁的、可以捕获封闭函数体的值的匿名闭包。
4.回顾嵌套函数;
对于第五点中的嵌套函数来说,3个嵌套函数的函数名的作用域仅仅就是在switch中,一旦离开了getMathFunc函数后,3个嵌套函数的函数名就没有用了。既然嵌套函数的函数名没有太大的意义,那么就可以考虑使用闭包表达式来简化嵌套函数的写法。
5.使用闭包表达式代替嵌套函数。举个栗子:对上面的例子进行修改
func getMathFunc(#type : String) -> (Int) -> Int
{
//该函数返回的是闭包
switch(type)
{
case "square":
return {(val : Int) -> Int in //****使用in来代替了原来的函数的大括号
return val * val
}
case "cube":
return { (val : Int) -> Int in
return val * val * val
}
default:
return { (val : Int) -> Int in
var result = 1
for index in 2...val
{
result *= index
}
return result
}
}
}
可以看出,在两次的switch代码块中,除了在声明函数格式那里不同之外,函数体内的代码块和闭包表达式内的代码块是完全相同的。
6.定义闭包和嵌套函数只是存在如下3点区别:
(1)定义闭包不需要func关键字,不需要指定函数名
(2)定义闭包需要使用关键字in来代替函数的大括号
(3)定义闭包的第一个花括号要移到形参列表的圆括号之前
网友评论