免费开源的iOS开发学习平台

Swift: 7.2 函数类型和嵌套函数

函数类型

  • 在Swift中,每个函数都是一种特定的函数类型,函数类型由函数的参数类型和返回类型组成。使用函数类型就像使用其他类型一样,例如,可以定义一个类型为函数的常量或变量,并且把函数值赋给它。
func addTwo( a : Int, b: Int)-> Int{
    return a+b
}
var sumTwo: (Int, Int)-> Int = addTwo
//也可以简写 var sumTwo = addTwo
sumTwo(1,3)
  • 函数类型也可以作为另一个函数的参数进行传递。
func printAddTwo(addTwo: (Int,Int)->Int,a: Int, b: Int){
    print("\(addTwo(a,b))")
    //打印结果:3
}
printAddTwo(addTwo: addTwo, a: 1, b: 2)
  • 同样的,函数类型可以作为另一个函数的返回值进行返回。
func returnAddFunc()->((Int,Int)->Int){
    return addTwo
}
let addFunc = returnAddFunc()
addFunc(1,2) //打印结果:3

嵌套函数

在本章前面的内容中,我们所见到的所有函数都叫全局函数(global function),它们都被定义在全局域中。在Swift语言中,也可以把函数定义在别的函数体中,这称作嵌套函数(nested function)。在默认情况下,嵌套函数是对外界不可见的,但是可以被它们的封闭函数(enclosing function)来调用。

func returnMinusFunc()->((Int, Int)->Int){
    func minusFunc(a: Int, b: Int)->Int{
        return a-b
    }
return minusFunc
}
let minusTwoInt = returnMinusFunc()
print(minusTwoInt(5,1)) //打印:4

示例代码

下面代码演示函数类型和嵌套函数结合使用的方法。嵌套函数可以使用它所在的主函数中所有的变量的值的拷贝,也就是说,在嵌套函数中改变主函数的变量,不会影响主函数中该变量的值。

func avanceFunc(multi: Int, choose: Int)->((Int,Int)->Int){
    var base = 2
    func addFunc(a: Int, b: Int)->Int{
        print("addFunc 函数中 base 变量:\(base)")
        base = a + b //base只是主函数base变量的一个值拷贝
        
        return base * multi
    }
    func minusFunc(a: Int, b: Int)->Int{
        //base只是主函数base变量的一个值拷贝
        print("minusFunc 函数中 base 变量:\(base)")
        base = a - b
        return base * multi
    }
    //base 变量的值不会因为嵌套函数而改变
    print("advanceFunc 函数中 base 变量:\(base)")
    return choose == 1 ? addFunc : minusFunc;
}
let add = avanceFunc(multi: 2, choose: 1)

print(add(2,1))

print()
let minus1 = avanceFunc(multi: 2, choose: 2)

print(minus1(2,1))

运行结果如下图。

示例代码

https://github.com/99ios/23.8