Swift 5从零到精通iOS开发训练营
上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。在处理一些回调操作时,例如网络回调、子线程异步处理回调等场景中,使用这种编程方式将十分简洁优美。

函数可以作为参数,也可以作为返回值来使用,示例代码如下:

上面的演示代码中,在函数内部创建了闭包并将其返回,由于Swift语言支持进行函数嵌套,因此开发者也可以在函数内部再次创建函数,示例如下:

提示

函数也有其作用域,所谓嵌套函数是指在函数内部再创建一个子函数,子函数只能在父函数内部调用,不可以在父函数外部调用,但是可以作为返回值传递到父函数外部。