Function Types
每個function都有自己的function type,由參數跟回傳型態所組成:
func addTwoInts(a: Int, _ b: Int) -> Int {
return a + b
}
func multiplyTwoInts(a: Int, _ b: Int) -> Int {
return a * b
}
以上這兩個例子的function type 都是(Int, Int) -> Int,可以讀成:
這個function type有兩個參數,都是整數型態,並且回傳值的型態是整數。
還記得之前提到的,function不管怎樣都有回傳值,若沒有設定的話,其型態是空的tuple,也就是Void,例如:
func printHi() {
print("Hi")
}
//這個function的型態為 () ->Void,也可讀成”這個function 沒有參數,並且回傳空值”
Using Function Types
我們可以使用function type,就像我們之前用的型態比如Int, String之類的,如:
var mathFunction : (Int, Int) -> Int = addTwoInts
這時候mathFunction 就有跟addTwoInts一樣的功能了,呼叫的方法也是一樣:
print("Result: \(mathFunction(2, 3))") //Result : 5
由於另一個multiplyTwoInts的型態跟mathFunction一樣,因此也可以讓mathFunction有乘法的功能:
mathFunction = multiplyTwoInts
print("Result: \(mathFunction(2, 3))") //Result : 6
就像我們其他的用法,我們也可以讓Swift直接判斷他的function type,如:
let anotherMathFunction = addTwoInts
//anotherMathFunction 的型態自動判定為 (Int, Int) -> Int
Function Types as Parameter Types
我們也可以將function type當成另一個function的參數,讓我們在呼叫function時,可以調用同型態的function來使用,如:
func printMathResult(mathFunction: (Int, Int) -> Int, _ a: Int, _ b: Int) {
print("Result: \(mathFunction(a, b))")
}
printMathResult(addTwoInts, 3, 5) // Result: 8
printMathResult(multiplyTwoInts, 3, 5) // Result: 15
Function Types as Resurn Types
除了當做function的參數,也可以將function type當成回傳值的型態,一樣是將function type 寫在 ->後面:
func chooseMathFunction(mathName: String) -> (Int, Int) ->Int {
if mathName == "Add" {
return addTwoInts
} else if mathName == "Mult"{
return multiplyTwoInts
}
}
let choosedMathFunction = chooseMathFunction("Add") // choosedMathFunction 即有跟addTwoInts一樣的功能。
Nested Functions
上面所有的例子裡都是global function,意即所有的人都可以拿來用;我們可以將function放到另一個function裡,這個方法稱為nested functions。 Nested functions不能夠任意的被拿來用,只有把他包起來的function(稱為enclosing function)能用。Enclosing function 也可以將裡面的nested function回傳出去給外部使用:
func chooseMathFunction(mathName: String) -> (Int, Int) ->Int {
func addTwoInts(a: Int, _ b: Int) -> Int {
return a + b
}
func multiplyTwoInts(a: Int, _ b: Int) -> Int {
return a * b
}
if mathName == "Add" {
return addTwoInts
} else if mathName == "Mult"{
return multiplyTwoInts
}
}
上面的例子將addTwoInts及multiplyTwoInts放到chooseMathFunction裡,並在做出選擇後將其中一個回傳出去。
let mathFunction = chooseMathFunction("Add")
這時候mathFunction就有addTwoInts的功能了(使用chooseMathFunction前,是不能用的)