三.函数类型
1. Swift的每个函数都有类型的,函数类型由函数的形参列表,返回值类型组成。
2.使用函数类型定义变量:就像使用普通类型定义变量一样。举个栗子:
var myFun : (Int, Int) -> Int//定义一个变量,其类型为(Int,Int)-> Int
var test : (String) -> String//定义一个变量,其类型为:(String)->String
定义了函数类型的变量后,就可以将函数赋值给该变量了:
//定义一个计算乘方的函数
func pow(#base : Int, #exponent : Int0 -> Int
{
var result = 1;
for i int 1...exponent
{
result *= exponent
}
return result
}
//将pow函数赋值给myFun变量,则myFun可以当成pow使用
myFun = pow
//使用myFun
print(myFun(base:3, exponent:4))
//定义一个计算矩形面积的函数
func area(#width : Int, #height : Int) -> Int
{
return width * height
}
//将area函数赋值给myFun,并使用myFun,
myFun = area
print(myFun(3, 4)//输出12
个人感觉就是函数别名。。。。。
3.通过使用函数类型的变量,可以让myFun在不同的时间指向不同的函数,从而让程序更加灵活。
4.使用函数类型作为形参类型;有时候需要定义一个函数,该函数的大部分计算逻辑都能确定,但某些处理逻辑暂时无法确定----这意味着某些代码需要动态改变,如果希望调用函数时能动态传入传入这些代码,这就需要在函数中定义函数类型的形参这样即可在调用该函数时传入不同的函数作为参数----函数类型的变量好像派上用场了。。。
5. Swift支持像使用其他类型一样使用函数类型,因此,可以在函数的形参列表中定义函数类型。举个栗子:
//在函数的形参列表中定义函数类型的形参,其中,形参名是fn,类型是(Int)->Int类型。
func map (var #data : [Int],#fu:(Int) -> Int0 -> Int
{
//遍历data数组中的元素,并用fn函数对每个元素进行计算,然后将计算结果作为新的数组元素
for var i=0, len=data.count; i
{
data[i] = fn(data[i])
}
}
//定义一个计算平方的函数
func square(val : Int) -> Int
{
return val * val
}
//定义一个计算立方的函数
funccube(val : Int) -> Int
{
return val * val * val
}
//定义一个计算阶乘的函数
func factorial(val : Int) -> Int
{
var resule = 1;
for index in 2...val
{
result *= index
}
return result
}
//data数组
var data = [3, 4, 9, 5, 8]
/下面程序3次调用map函数,每次调用时传入不同的函数
print(map(data : data, fn : square)) //输出【9,16,81,25,64】
print(map(data : data, fn ; cube)) //输出【27,64,729,125,512】
print(map(data : data, fn : factorial)) //输出【6,24,362880,120,40320】
不难看出,这种方式跟C语言中的函数指针很像。但是比C语言总的指针函数更加简单,易懂
6.使用函数类型作为返回值类型:在Swift中,可以将其他函数作为函数的返回值。举个栗子:
//定义一个计算平方的函数
func square(val : Int) -> Int
{
return val * val
}
//定义一个计算立方的函数
funccube(val : Int) -> Int
{
return val * val * val
}
//定义一个计算阶乘的函数
func factorial(val : Int) -> Int
{
var resule = 1;
for index in 2...val
{
result *= index
}
return result
}
//定义函数,该函数的返沪指类型为(Int) -> Int
func getMathFunx(#type : String) ->(Int) -> Int
{
switch(type)
{
case "square":
return square
case "cube":
return cube
default:
retun factorial
}
}
//调用函数getMathFunc后,该函数返回的是一个函数
var fun1 = getMathFunc(type : "square") //得到square函数
var fun2 = getMathFunc(type : "cube") //得到cube函数
var fun3 = getMathFunc(type : "other") //得到factorial函数
四.函数重载
1.同java中一样,Swift支持函数重载,只要函数的形参列表或者返回值类型不同就可以了。
2. Swift的特有特点:如果两个函数除了外部形参名不同,其他的都相同,系统也会把它们当作重载函数。
3.大部分时候并不推荐使用形参个数可变的方式进行函数重载,因为这样没有意义。