Swift: 7.2 函數類型和嵌套函數
函數類型
- 在Swift中,每個函數都是一種特定的函數類型,函數類型由函數的參數類型和返回類型組成。使用函數類型就像使用其他類型一樣,例如,可以定義一個類型為函數的常量或變量,并且把函數值賦給它。
func addTwo( a : Int, b: Int)-> Int{
return a+b
}
var sumTwo: (Int, Int)-> Int = addTwo
//也可以簡寫 var sumTwo = addTwo
sumTwo(1,3)
- 函數類型也可以作為另一個函數的參數進行傳遞。
func printAddTwo(addTwo: (Int,Int)->Int,a: Int, b: Int){
print("\(addTwo(a,b))")
//打印結果:3
}
printAddTwo(addTwo: addTwo, a: 1, b: 2)
- 同樣的,函數類型可以作為另一個函數的返回值進行返回。
func returnAddFunc()->((Int,Int)->Int){
return addTwo
}
let addFunc = returnAddFunc()
addFunc(1,2) //打印結果:3
嵌套函數
在本章前面的內容中,我們所見到的所有函數都叫全局函數(global function),它們都被定義在全局域中。在Swift語言中,也可以把函數定義在別的函數體中,這稱作嵌套函數(nested function)。在默認情況下,嵌套函數是對外界不可見的,但是可以被它們的封閉函數(enclosing function)來調用。
func returnMinusFunc()->((Int, Int)->Int){
func minusFunc(a: Int, b: Int)->Int{
return a-b
}
return minusFunc
}
let minusTwoInt = returnMinusFunc()
print(minusTwoInt(5,1)) //打?。?
示例代碼
下面代碼演示函數類型和嵌套函數結合使用的方法。嵌套函數可以使用它所在的主函數中所有的變量的值的拷貝,也就是說,在嵌套函數中改變主函數的變量,不會影響主函數中該變量的值。
func avanceFunc(multi: Int, choose: Int)->((Int,Int)->Int){
var base = 2
func addFunc(a: Int, b: Int)->Int{
print("addFunc 函數中 base 變量:\(base)")
base = a + b //base只是主函數base變量的一個值拷貝
return base * multi
}
func minusFunc(a: Int, b: Int)->Int{
//base只是主函數base變量的一個值拷貝
print("minusFunc 函數中 base 變量:\(base)")
base = a - b
return base * multi
}
//base 變量的值不會因為嵌套函數而改變
print("advanceFunc 函數中 base 變量:\(base)")
return choose == 1 ? addFunc : minusFunc;
}
let add = avanceFunc(multi: 2, choose: 1)
print(add(2,1))
print()
let minus1 = avanceFunc(multi: 2, choose: 2)
print(minus1(2,1))
運行結果如下圖。