本文共 1718 字,大约阅读时间需要 5 分钟。
函数分为全局函数和局部函数,前面已经介绍了全局函数,下面介绍下局部函数,定义在函数体内部的函数可以成为嵌套函数。
注意:嵌套函数对外是隐蔽的,只能在其封闭函数内有效,嵌套函数只能在其封闭函数内有效,其封闭函数也可以返回嵌套函数,以便于程序在其他作用域内使用嵌套函数。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函数,调用权利给mathFuncprint(mathFunc(5))调用cube函数,输出125var 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 inreturn val*val}print(square(5))var result=(#base:Int,#exponent:Int)->Int invar result = 1for 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
如果闭包表达式只有一行代码,并且这行代码的返回值将作为闭包表达式的返回值,那么可以省略
转载地址:http://mytta.baihongyu.com/