Swift 程式語言 — Functions (2)
繼續深入研究更度 functions 的應用方式。
前言:
前一篇文章我們介紹了一些 functions 的基礎概念,讓大家能夠了解一個 function 是由哪幾個部分所組成,理解到 functions 所謂的參數、返回值、參數標籤等等…。這次文章我們會由 Function Types 繼續研究下去。
⎮ 函數類型
每個函數都有一個特定的函數類型,由參數類型和返回類型所組成。
首先我們先定義兩個簡單的數學式(加法、乘法),兩者的所帶入的參數和回傳值都為 Int 類型:
由兩個數學式我們可以理解成,這個函數會丟入兩個 Int 類型的參數,並返回一個 Int 類型的回傳值,所以兩個數學式的類型為 (Int, Int) -> Int
。
而如果是這個範例我們可以理解成,這個函數不需要丟入任何參數,並且也沒有任何回傳值,所以該函數的類型為 () -> Void
。
⎮ 使用函數類型
你可以像是任何 Swift 中的類型來使用函數類型。例如:你可以將常數或變數定義為函數類型,並為該變數分配合適的函數。
上面我們宣告一個 matchFunction
的變數,該類型為 (Int, Int) -> Int
,並且賦給它上面的 add
函數。當然我們也能賦給他 mul
函數,因為其兩者的類型皆為 (Int, Int) -> Int
。
而當我們賦給 mathFunction
後,我們也依然可以用相同的方式來使用函數,我們下列賦給 mathFunction
不同函數時,也會得到不同的結果:
當然我們可以不要在常數或變數後方加上其函數類型,因為 Swift 中的類型推斷其類型,以下面的例子來說,Swift 會推斷出 anotherMathFunction
這個常數的類型為 (Int, Int) -> Int
。
⎮ 使用函數類型作為參數類型
你可以使用函數類型作為另一個函數的參數類型。這能夠使你去保留函數實現的某些部分,以便在調用函數時提供。
這邊我們定義了一個會回傳數學式結果的函數 getResult
,該函數有三個參數。第一個參數為 mathFunction
,該類型為 (Int, Int) -> Int
,可以傳遞任何相同類型的函數作為其第一個參數。第二、三的參數稱為 a
跟 b
,我們只需提供其 Int 類型的值即可。
因此我們 getResult
的方法只會單純回傳結果,他不管 mathFunction
接收 a
、b
參數後執行了哪種運算方法,他只會在最後回傳 mathFunction
的運算結果。
⎮ 使用函數類型作為返回值類型
當然我們也能用函數類型作為某個函數的返回類型。你可以透過返回函數的返回箭頭之後編寫出完整的函數類型來達成。
我們這邊使用官方的範例來說明,這邊我們提供了兩個方法,分別為 stepBackward
和 stepForward
,而這兩者個別將其 input
進行加 1 或是減 1 的操作:
而接下來我們會定義一個 chooseStepFunction
函數,其中有一個 Bool
類型的參數稱為 backward
,我們會藉由他來判斷要執行前進還是後退的操作:
接著我們宣告一個變數 currentValue
來記錄當前值,以及一個常數 moveNearerToZero
來接收由 chooseStepFunction
的回傳。
這邊如果 currentValue
大於 0,那麼我們會返回一個 stepBackward
函數給 moveNearerToZero
,反之,則返回 stepForward
。以我們這個範例來說我們最後返回了一個 stepBackward
給 moveNearerToZero
。
接下來我們寫一個 while
迴圈執行stepBackward
直到currentValue
等於 0 為止,而在 while
迴圈裡每次都會將 stepBackward
的回傳值賦給 currentValue
,最後可以看到我們的 currentValue
為 0:
⎮ 嵌套函數
在這之前我們學到的函數都是定義在全局函數的範例,這些函數都在全局範圍內被定義。但你還能夠在其他函數的函數體內定義函數,我們稱為嵌套函數 ( Nested Functions )。
默認情況下,嵌套函數對外界是隱藏的,但是他們的封閉函數仍然可以調用他們。封閉函數也可以返回其嵌套函數之一,已允許嵌套函數在另一個範圍內使用。
以我們上方的例子來說,我們也能把其 stepForward
和 stepBackward
兩個方法放到我們的 chooseStepFunction
的函數體中,依然會將我們的 (Int) -> Int
函數類型回傳出去:
後記:
那我們這次 Function 第二篇的介紹就到這邊結束了,我們學會了如何使用一個函數類型,並且以函數類型作為參數類型或是返回值類型,以及定義在函數裡的函數 —— 嵌套函數,希望經由這邊文章讓大家能夠學會更多 function 的應用。