一、函数的重载
规则 : a、函数名相同 b、参数个数不同、参数类型不同 参数标签不同
//原函数
func sum(a: Int , b: Int) -> Int{ a + b }
// 参数个数不同
func sum(a: Int ,b: Int ,c: Int) -> Int{ a + b + c }
//参数类型不同
func sum(a: Int ,b: Double) -> Double { Double(a) + b }
// 忽略标签
func sum(_ a: Int ,_ b: Int) -> Int{ a + b }
//参数标签不同
func sum (v1: Int ,v2: Int) -> Int{ v1 + v2 }
调用
注意点:
a、返回值类型与函数重载无关
b、默认参数值和函数重载一起使用产生二义性时,编译器并不会报错 (在C++中会报错)
func sum(a: Int ,b: Int) -> Int { a + b}
func sum(a: Int ,b: Int , c: Int = 10 ) -> Int { a + b + c }
//会调用的是: sum(a: Int ,b: Int) -> Int
sum(a: 10, b: 20) // 30
c、可变参数、省略参数标签、函数重载一起使用产生二义性时,编译器有可能会报错
二、函数类型
1、每一个函数都是有类型的,函数类型由形式参数类型 、返回值类型组成
func test(){} //() -> void 或 () -> ()
func sum(a: Int ,b: Int) -> Int {a + b } // (Int , Int) -> Int
//定义变量
var fn: (Int ,Int) -> Int = sum(a:b:)
print(fn(20,25)) // 45
2、函数类型作为函数参数
func sum (a: Int ,b: Int) -> Int{ a + b}
func differece(a: Int ,b: Int) -> Int { a - b}
func printResult(_ mathFn:(Int ,Int) -> Int ,_ a: Int ,_ b: Int){
print(mathFn(a,b))
}
printResult(sum(a:b:), 30, 40) // 70
printResult(differece(a:b:), 60, 50) // 10
3、函数类型作为返回值 (返回值是函数类型的函数,叫做高阶函数)
func next(_ input: Int) -> Int { input + 1}
func previous(_ input: Int) -> Int {input - 1}
func forward(_ forward : Bool) -> (Int) -> Int{
forward ? next(_:) : previous(_:)
}
print(forward(false)(3)) // 2
print(forward(true)(3)) // 4
4、嵌套函数 (将函数定义在函数内部)
func forward(_ forward: Bool) -> (Int) -> Int {
func next(_ input: Int) -> Int { input + 1 }
func previous(_ input: Int) -> Int { input - 1 }
return forward ? next(_:) : previous(_:)
}
print(forward(false)(3)) // 2
print(forward(true)(3)) // 4