每天学一点Swift----闭包(一)

五.嵌套函数

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)定义闭包的第一个花括号要移到形参列表的圆括号之前

你可能感兴趣的:(每天学一点Swift----闭包(一))