Swift 程式語言 — Functions (2)

繼續深入研究更度 functions 的應用方式。

Jeremy Xue
Jeremy Xue ‘s Blog
6 min readFeb 13, 2019

--

Photo by Nate Grant on Unsplash

前言:

前一篇文章我們介紹了一些 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,可以傳遞任何相同類型的函數作為其第一個參數。第二、三的參數稱為 ab ,我們只需提供其 Int 類型的值即可。

因此我們 getResult 的方法只會單純回傳結果,他不管 mathFunction 接收 ab 參數後執行了哪種運算方法,他只會在最後回傳 mathFunction 的運算結果。

⎮ 使用函數類型作為返回值類型

當然我們也能用函數類型作為某個函數的返回類型。你可以透過返回函數的返回箭頭之後編寫出完整的函數類型來達成。

我們這邊使用官方的範例來說明,這邊我們提供了兩個方法,分別為 stepBackwardstepForward ,而這兩者個別將其 input 進行加 1 或是減 1 的操作:

而接下來我們會定義一個 chooseStepFunction 函數,其中有一個 Bool 類型的參數稱為 backward ,我們會藉由他來判斷要執行前進還是後退的操作:

接著我們宣告一個變數 currentValue 來記錄當前值,以及一個常數 moveNearerToZero 來接收由 chooseStepFunction 的回傳。

這邊如果 currentValue 大於 0,那麼我們會返回一個 stepBackward 函數給 moveNearerToZero ,反之,則返回 stepForward 。以我們這個範例來說我們最後返回了一個 stepBackwardmoveNearerToZero

接下來我們寫一個 while 迴圈執行stepBackward直到currentValue 等於 0 為止,而在 while 迴圈裡每次都會將 stepBackward 的回傳值賦給 currentValue ,最後可以看到我們的 currentValue 為 0:

⎮ 嵌套函數

在這之前我們學到的函數都是定義在全局函數的範例,這些函數都在全局範圍內被定義。但你還能夠在其他函數的函數體內定義函數,我們稱為嵌套函數 ( Nested Functions )。

默認情況下,嵌套函數對外界是隱藏的,但是他們的封閉函數仍然可以調用他們。封閉函數也可以返回其嵌套函數之一,已允許嵌套函數在另一個範圍內使用。

以我們上方的例子來說,我們也能把其 stepForwardstepBackward 兩個方法放到我們的 chooseStepFunction 的函數體中,依然會將我們的 (Int) -> Int 函數類型回傳出去:

後記:

那我們這次 Function 第二篇的介紹就到這邊結束了,我們學會了如何使用一個函數類型,並且以函數類型作為參數類型或是返回值類型,以及定義在函數裡的函數 —— 嵌套函數,希望經由這邊文章讓大家能夠學會更多 function 的應用。

--

--

Jeremy Xue
Jeremy Xue ‘s Blog

Hi, I’m Jeremy. [好想工作室 — iOS Developer]