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
        }

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