5.2 函数的类型与函数嵌套

前面章节有提到,Swift语言中每一个函数都有其特定的类型。因此,开发者也可以像声明普通变量那样来声明一个函数变量,同样也可以对此变量进行赋值、调用等操作。将函数作为数据类型这种语言设计思路有强大的优势,这将允许开发者将一个函数作为另一个函数的参数或者返回值,大大增强了编程的灵活性。

函数变量的声明及赋值示例代码如下:

    //声明一个函数变量
    var addFunc:(Int,Int)->Int
    //对函数变量进行赋值
    addFunc = {(param1:Int,param2:Int) in return param1+param2}
    //调用函数变量
    addFunc(2,3)

函数变量的类型由参数和返回值决定,参数和返回值相同的函数类型就相同。上面示例代码中对函数变量的赋值采用了闭包的方式,闭包的实质是一段有具体功能的代码块,其结构为{(param1,param2,…) in代码块},其最外面由大括号包围,内部小括号为参数列表,in为闭包关键字,之后需要编写实现相应功能的代码。关于闭包的更多内容,后面章节会详细介绍。

也可以通过一个函数来对函数变量进行赋值,示例如下:

函数也可以作为另一个函数的参数,示例代码如下:

如上代码所示,这种将函数作为参数的编程方式应用十分广泛,在Objective-C语言中,这种语法结构被称为block。在处理一些回调操作时,例如网络回调、子线程异步处理回调等场景中,使用这种编程方式将十分简洁优美。

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

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

提示

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