9.4 函数类型

每个函数都有一个类型,使用函数的类型与使用其他数据类型一样,可以声明变量或常量,也可以作为其他函数的参数或者返回值。

我们有如下3个函数的定义:

  1. //定义计算长方形面积函数
  2. func rectangleArea(width:Double, height:Double) -> Double {
  3. let area = width height
  4. return area
  5. }
  6. //定义计算三角形面积函数
  7. func triangleArea(bottom:Double, height:Double) -> Double {
  8. let area = 0.5 bottom * height
  9. return area
  10. }
  11. func sayHello() {
  12. println("Hello, World")
  13. }

上述代码中,我们定义了两个函数,其中第①行rectangleArea(width:Double, height:Double) -> Double函数和第②行triangleArea(bottom:Double, height:Double) -> Double函数,函数类型都是(Double, Double) -> Double。第③行sayHello()函数的函数类型是()->()

9.4.1 作为函数返回类型使用

我们可以把函数类型作为另一个函数的返回类型使用。下面看一个示例:

  1. //定义计算长方形面积函数
  2. func rectangleArea(width:Double, height:Double) -> Double {
  3. let area = width * height
  4. return area
  5. }
  6. //定义计算三角形面积函数
  7. func triangleArea(bottom:Double, height:Double) -> Double {
  8. let area = 0.5 bottom height
  9. return area
  10. }
  11. func getArea(type : String) -> (Double, Double) -> Double {
  12. var returnFunction:(Double, Double) -> Double
  13. switch (type) {
  14. case "rect": //rect 表示长方形
  15. returnFunction = rectangleArea
  16. case "tria": //tria 表示三角形
  17. returnFunction = triangleArea
  18. default:
  19. returnFunction = rectangleArea
  20. }
  21. return returnFunction
  22. }
  23. //获得计算三角形面积函数
  24. var area : (Double, Double) = getArea("tria")
  25. println("底10 高13,三角形面积:\(area(10,15))")
  26. //获得计算长方形面积函数
  27. area = getArea("rect")
  28. println("宽10 高15,计算长方形面积:\(area(10,15))")

上述代码第①行定义函数getArea(type : String) -> (Double, Double) -> Double,其返回类型是(Double, Double) -> Double,这说明返回值是一个函数类型。第②行代码声明returnFunction,它的类型是(Double, Double) -> Double函数类型。第③行代码是在类型typerect(即长方形)的情况下,把上一节定义的rectangleArea函数名赋值给returnFunction变量,这种赋值之所以能够成功是因为returnFunction类型是rectangleArea函数类型。第④行和第⑤行代码也是如此。第⑥行代码将returnFunction变量返回。

第⑦行和第⑨行代码调用函数getArea,返回值area是函数类型。第⑧行和第⑩行中的area(10,15)调用函数,它的参数列表是(Double, Double)

上述代码运行结果如下:

  1. 10 13,三角形面积:75.0
  2. 10 15,计算长方形面积:150.0

9.4.2 作为参数类型使用

我们可以把函数类型作为另一个函数的参数类型使用。下面看一个示例:

  1. //定义计算长方形面积函数
  2. func rectangleArea(width:Double, height:Double) -> Double {
  3. let area = width * height
  4. return area
  5. }
  6. //定义计算三角形面积函数
  7. func triangleArea(bottom:Double, height:Double) -> Double {
  8. let area = 0.5 bottom height
  9. return area
  10. }
  11. func getAreaByFunc(funcName : (Double, Double) -> Double, a:Double, b:Double) -> Double {
  12. var area = funcName(a,b)
  13. return area
  14. }
  15. //获得计算三角形面积函数
  16. var result : Double = getAreaByFunc(triangleArea, 10, 15)
  17. println("底10 高13,三角形面积:\(result)")
  18. //获得计算长方形面积函数
  19. result = getAreaByFunc(rectangleArea, 10, 15)
  20. println("宽10 高15,计算长方形面积:\(result)")

上述代码第①行定义函数getAreaByFunc,它的第一个参数funcName类型是函数类型(Double, Double) -> Double,第二个和第三个参数都是Double类型。函数的返回值是Double类型,是计算获得的几何图形面积。

第②行是调用函数getAreaByFunc,我们给它传递的第一个参数triangleArea是前文定义的计算三角形面积的函数名,第二个参数是三角形的底边,第三个参数是三角形的高。函数的返回值resultDouble,是计算所得的三角形面积。

第③行也是调用函数getAreaByFunc,我们给它传递的第一个参数rectangleArea是前文定义的计算长方形面积的函数名,第二个参数是长方形的宽,第三个参数是长方形的高。函数的返回值result也是Double,是计算所得的长方形面积。

上述代码的运行结果如下:

  1. 10 13,三角形面积:75.0
  2. 10 15,计算长方形面积:150.0

综上所述,比较本节与上一节示例,可见它们具有相同的结果,都使用了函数类型(Double, Double) -> Double,通过该函数类型调用triangleArearectangleArea函数计算几何图形面积。上一节是把函数类型作为函数返回值类型使用,而本节是把函数类型作为函数的参数类型使用。经过前文的介绍,函数类型也没有什么难的,与其他类型的用法是一样的。