close

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前,是不能用的)

arrow
arrow
    全站熱搜

    Eason 發表在 痞客邦 留言(1) 人氣()