9.4 函数类型
每个函数都有一个类型,使用函数的类型与使用其他数据类型一样,可以声明变量或常量,也可以作为其他函数的参数或者返回值。
我们有如下3个函数的定义:
//定义计算长方形面积函数func rectangleArea(width:Double, height:Double) -> Double { ①let area = width * heightreturn area}//定义计算三角形面积函数func triangleArea(bottom:Double, height:Double) -> Double { ②let area = 0.5 * bottom * heightreturn 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 * heightreturn area}//定义计算三角形面积函数func triangleArea(bottom:Double, height:Double) -> Double {let area = 0.5 * bottom * heightreturn 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 * heightreturn area}//定义计算三角形面积函数func triangleArea(bottom:Double, height:Double) -> Double {let area = 0.5 * bottom * heightreturn 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函数计算几何图形面积。上一节是把函数类型作为函数返回值类型使用,而本节是把函数类型作为函数的参数类型使用。经过前文的介绍,函数类型也没有什么难的,与其他类型的用法是一样的。
