上QQ阅读APP看书,第一时间看更新
5.2 函数的类型与函数嵌套
前面章节提到,Swift语言中每一个函数都有其特定的类型。因此,开发者也可以像声明普通变量那样来声明一个函数变量,同样也可以对此变量进行赋值、调用等操作。将函数作为数据类型这种语言设计思路有强大的优势,这将允许开发者将一个函数作为另一个函数的参数或者返回值,大大增强了编程的灵活性。
函数变量的声明及赋值示例代码如下:
//声明一个函数变量 var addFunc:(Int, Int)->Int //对函数变量进行赋值 addFunc = {(param1:Int, param2:Int) in return param1+param2} //调用函数变量 addFunc(2,3)
函数变量的类型由参数和返回值决定,参数和返回值相同的函数类型就相同。上面示例代码中对函数变量的赋值采用了闭包的方式,闭包的实质是一段有具体功能的代码块,其结构为{(param1, param2, …) in代码块},其最外面由大括号包围,内部小括号为参数列表,in为闭包关键字,之后需要编写实现相应功能的代码。关于闭包的更多内容,后面章节会详细介绍。
也可以通过一个函数来对函数变量进行赋值,示例如下:
var addFunc:(Int, Int)->Int func myFunc13(param1:Int, param2:Int) -> Int { return param2+param1 } addFunc = myFunc13 addFunc(1,2)
函数也可以作为另一个函数的参数,示例代码如下:
//参数param的类型为函数类型(Int, Int)->Int func myFunc14(param:(Int, Int)->Int) { print(param(1,2)) } //将addFunc函数作为参数传递进myFunc14函数 myFunc14(param: addFunc)
如上代码所示,这种将函数作为参数的编程方式应用十分广泛,在Objective-C语言中,这种语法结构被称为block。在处理一些回调操作时,例如网络回调、子线程异步处理回调等场景中,使用这种编程方式将十分简洁优美。
函数可以作为参数,同样其也可以作为返回值来使用,示例代码如下:
//声明一个函数变量 var addFunc:(Int, Int)->Int func myFunc15() -> (Int, Int)->Int { return {(param1:Int, param2:Int)in return param1+param2 } } //使用addFunc变量获取返回值 addFunc = myFunc15() //进行调用 addFunc(1,2)
上面的演示代码中,在函数内部创建了闭包并将其返回,由于Swift语言是支持进行函数嵌套的,实际上开发者也可以在函数内部再次创建函数,示例如下:
func myFunc16() -> (Int, Int)->Int { func subFunc(param1:Int, param2:Int)->Int{ return param1+param2 } return subFunc }
函数也有其作用域,所谓嵌套函数是指在函数内部再次创建一个子函数,子函数只能在父函数内部调用,不可以在父函数外部调用,但是可以作为返回值传递到父函数外部。