9.4 函数类型
每个函数都有一个类型,使用函数的类型与使用其他数据类型一样,可以声明变量或常量,也可以作为其他函数的参数或者返回值。
我们有如下3个函数的定义:
//定义计算长方形面积函数
func rectangleArea(width:Double, height:Double) -> Double { ①
let area = width height
return area
}
//定义计算三角形面积函数
func triangleArea(bottom:Double, height:Double) -> Double { ②
let area = 0.5 bottom * height
return area
}
func sayHello() { ③
println("Hello, World")
}
上述代码中,我们定义了两个函数,其中第①行rectangleArea(width:Double, height:Double) -> Double
函数和第②行triangleArea(bottom:Double, height:Double) -> Double
函数,函数类型都是(Double, Double) -> Double
。第③行sayHello()
函数的函数类型是()->()
。
9.4.1 作为函数返回类型使用
我们可以把函数类型作为另一个函数的返回类型使用。下面看一个示例:
//定义计算长方形面积函数
func rectangleArea(width:Double, height:Double) -> Double {
let area = width * height
return area
}
//定义计算三角形面积函数
func triangleArea(bottom:Double, height:Double) -> Double {
let area = 0.5 bottom height
return area
}
func getArea(type : String) -> (Double, Double) -> Double { ①
var returnFunction:(Double, Double) -> Double ②
switch (type) {
case "rect": //rect 表示长方形
returnFunction = rectangleArea ③
case "tria": //tria 表示三角形
returnFunction = triangleArea ④
default:
returnFunction = rectangleArea ⑤
}
return returnFunction ⑥
}
//获得计算三角形面积函数
var area : (Double, Double) = getArea("tria") ⑦
println("底10 高13,三角形面积:\(area(10,15))") ⑧
//获得计算长方形面积函数
area = getArea("rect") ⑨
println("宽10 高15,计算长方形面积:\(area(10,15))") ⑩
上述代码第①行定义函数getArea(type : String) -> (Double, Double) -> Double
,其返回类型是(Double, Double) -> Double
,这说明返回值是一个函数类型。第②行代码声明returnFunction
,它的类型是(Double, Double) -> Double
函数类型。第③行代码是在类型type
为rect
(即长方形)的情况下,把上一节定义的rectangleArea
函数名赋值给returnFunction
变量,这种赋值之所以能够成功是因为returnFunction
类型是rectangleArea
函数类型。第④行和第⑤行代码也是如此。第⑥行代码将returnFunction
变量返回。
第⑦行和第⑨行代码调用函数getArea
,返回值area
是函数类型。第⑧行和第⑩行中的area(10,15)
调用函数,它的参数列表是(Double, Double)
。
上述代码运行结果如下:
底10 高13,三角形面积:75.0
宽10 高15,计算长方形面积:150.0
9.4.2 作为参数类型使用
我们可以把函数类型作为另一个函数的参数类型使用。下面看一个示例:
//定义计算长方形面积函数
func rectangleArea(width:Double, height:Double) -> Double {
let area = width * height
return area
}
//定义计算三角形面积函数
func triangleArea(bottom:Double, height:Double) -> Double {
let area = 0.5 bottom height
return area
}
func getAreaByFunc(funcName : (Double, Double) -> Double, a:Double, b:Double) -> Double { ①
var area = funcName(a,b)
return area
}
//获得计算三角形面积函数
var result : Double = getAreaByFunc(triangleArea, 10, 15) ②
println("底10 高13,三角形面积:\(result)") ③
//获得计算长方形面积函数
result = getAreaByFunc(rectangleArea, 10, 15) ④
println("宽10 高15,计算长方形面积:\(result)") ⑤
上述代码第①行定义函数getAreaByFunc
,它的第一个参数funcName
类型是函数类型(Double, Double) -> Double
,第二个和第三个参数都是Double
类型。函数的返回值是Double
类型,是计算获得的几何图形面积。
第②行是调用函数getAreaByFunc
,我们给它传递的第一个参数triangleArea
是前文定义的计算三角形面积的函数名,第二个参数是三角形的底边,第三个参数是三角形的高。函数的返回值result
是Double
,是计算所得的三角形面积。
第③行也是调用函数getAreaByFunc
,我们给它传递的第一个参数rectangleArea
是前文定义的计算长方形面积的函数名,第二个参数是长方形的宽,第三个参数是长方形的高。函数的返回值result
也是Double
,是计算所得的长方形面积。
上述代码的运行结果如下:
底10 高13,三角形面积:75.0
宽10 高15,计算长方形面积:150.0
综上所述,比较本节与上一节示例,可见它们具有相同的结果,都使用了函数类型(Double, Double) -> Double
,通过该函数类型调用triangleArea
和rectangleArea
函数计算几何图形面积。上一节是把函数类型作为函数返回值类型使用,而本节是把函数类型作为函数的参数类型使用。经过前文的介绍,函数类型也没有什么难的,与其他类型的用法是一样的。