每个函数都有种特定的函数类型,由函数的参数类型和返回类型组成。
函数的类型是 (Int, Int) -> Int ,可以解读为“这个函数类型有两个 Int 型的参数并返回一个 Int 型的值。”
使用函数类型(Using Function Types)
//1>使用函数类型
//基本形式
var mathFunction:(Int,Int) ->Int = addTwoInts
mathFunction(2,3)
//有相同匹配类型的不同函数可以被赋值给同一个变量,就像非函数类型的变量一样:
mathFunction = mutiplyTwoInts
mathFunction(2,3)
//就像其他类型一样,当赋值一个函数给常量或变量时,你可以让 Swift 来推断其函数类型:
let anotherMathFunction = addTwoInts
anotherMathFunction(2,3)
函数类型作为参数类型(Function Types as Parameter Types)
//2>函数类型作为参数类型
/**
* 你可以用 (Int, Int) -> Int 这样的函数类型作为另一个函数的参数类型。这样你可以将函数的一部分实现留给函 数的调用者来提供。
优点,作用:
printMathResult(_:_:_:) 函数的作用就是输出另一个适当类型的数学函数的调用结果。它不关心传入函数是如 何实现的,它只关心这个传入的函数类型是正确的。这使得 printMathResult(_:_:_:) 能以一种类型安全(typ e-safe)的方式将一部分功能转给调用者实现。
*/
func prinfMathResult(mathFunction:(Int,Int)->Int,_ a:Int,_ b:Int){
print("Result:\(mathFunction(a,b))")
}
prinfMathResult(mutiplyTwoInts, 3, 5)
函数类型作为返回类型(Function Types as Return Types)
//3>函数类型作为返回值类型
/**
* 你可以用函数类型作为另一个函数的返回类型。你需要做的是在返回箭头( -> )后写一个完整的函数类型。
*/
func stepForward(input:Int)->Int{
return input + 1 //返回值类型(Int) -> Int
}
func stepBackward(input:Int)->Int{
return input - 1
}
func chooseStepFunction(backwards:Bool)->(Int)->Int{
return backwards ? stepBackward:stepForward
}
var currentValue = 3
let moveNearerToZero = chooseStepFunction(currentValue > 0)
print("Counting to zero:")
while currentValue != 0{
print("\(currentValue)")
currentValue = moveNearerToZero(currentValue)
}
print("zero!")
嵌套函数
//4>嵌套函数
/**
* 默认情况下,嵌套函数是对外界不可见的,但是可以被它们的外围函数(enclosing function)调用。一个外围 函数也可以返回它的某一个嵌套函数,使得这个函数可以在其他域中被使用。
*/
func chooseStepFunction2(backwards:Bool)->(Int)->Int{
func stepForward(input:Int)->Int{
return input + 1
}
func stepBackward(input:Int)->Int{
return input - 1
}
return backwards ? stepBackward:stepForward
}
var currentValue2 = -3
let moveNearerToZero2 = chooseStepFunction(currentValue2 > 0)
print("Counting to zero:")
while currentValue2 != 0{
print("\(currentValue2)")
currentValue2 = moveNearerToZero2(currentValue2)
}
print("zero!")