iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 11
0
Software Development

Swift 菜鳥的30天系列 第 11

Day-11 Swift 語法(7) - Functions 類型

Function 類型

每一個函數都有屬於他的一種特定的 function type ,他由參數類型以及返回類型所組成。舉個簡單的數學式加法的範例提供說明:
https://ithelp.ithome.com.tw/upload/images/20171230/20107701PzmGcqQVG1.png

他說明了這個 functions ,是傳入兩個 Int 類型值計算後,並且返回一個 Int 類型的值。同時,也代表這個 functions 的類型是 (Int, Int) -> Int 。表示有兩個形式參數的 fuction 類型,它們都是 Int 類型,並且返回一個 Int 類型的值。

https://ithelp.ithome.com.tw/upload/images/20171230/20107701ll2v9y76nD.png

上面這個例子是一個沒有參數以及返回值的 functions , 所以他的 function 類型為 () -> Void ,表示這是一個沒有形式參數的 function , 他的返回值為 Void 。

使用 function 類型

你可以像使用Swift 中的其他類型一樣使用 function 的類型。例如,你可以給一個常量或變量定義一個 fuction Type,並且為變數指定一個相應的 function。所以我們宣告一個叫做 addFunc 的變數,他的類型是可以接受兩個 Int 類型值並且返回一個 Int 值 , 將這個變數指向 add 這個 fuction。

https://ithelp.ithome.com.tw/upload/images/20171230/20107701B1X4Mxh1c7.png
之後你也可以使用 addFunc 來調用指定的 function。

假設兩者的 function 類型相同,也可以使用等號( = ) 指向該方法,如同下面例子中,addFunc 與 sub 的 function 兩者的function Type 都是 (Int,Int) -> Int ,所以可以用等號來將 addFunc 指向給 sub 這個 function 。
https://ithelp.ithome.com.tw/upload/images/20171230/20107701Vkpjxdut1w.png

當然你也可以採用一般的宣告方式,直接將變數指向一個 function ,並由 swift 來判斷他的 function 類型。
https://ithelp.ithome.com.tw/upload/images/20171230/20107701LbTQ0FEpdO.png


function 類型作為參數類型

你可以利用使用 function 的類型作為其他 function 的參數類型,這可以讓你預留 function 的部分實現而讓 function 的使用者在使用 function 時提供。

https://ithelp.ithome.com.tw/upload/images/20171230/201077016XkAF6uX6d.png

在這個例子中,我們定義一個叫 funcPrint 的 function,有三個參數在這個 function 中,其中有一個參數為 addFunc 它的類型為 (Int,Int) -> Int,你可以傳入任何相同類型的 function 作為這個 function 的第一個參數,以及第二、第三個類型為 Int 的 a , b 這兩個參數,它是提供給前面所選 function 使用的輸入值。

所以下面當你 funcPrint(mathFunc: add, a: 5, b: 3) 所運用的是加法運算得出 5 的結果,funcPrint(mathFunc: sub, a: 5, b: 3)則是得到 2 的結果。其實這個 funcPrint 的作用只是單純調用一個加法或是減法的 function 並輸出結果,他並不在意 function 中執行了什麼過程,他只會確認 function的類型是否正確,這使 funcPrint 可以以一種類型正確的方式將 function 傳給使用者使用。


function 類型作為返回類型

你當然也可以將 function 作為另一個 function 的返回類型,寫的方式只要在箭頭 -> 後面寫一個完整的 function Type 即可。

https://ithelp.ithome.com.tw/upload/images/20171230/20107701ox2ocdciOM.png
在這個範例中我們創建了一個叫 choose 的 function 他的參數 (range )為 Bool 值,我們希望它在結果為 true 的時候能實現79折的優惠,false 則是只有9折的優惠,為了符合他們兩者的類型,我們在返回值後方加上他們兩者的 function 類型(Double) -> Double。

並且我們宣告一個叫 GetDiscount 的常數,告訴他在價格超過 1000 的時候 choose(range: product > 1000),為達到79折優惠,也就是結果為 true,反之沒達到 1000 為 false。並使用 if 語法來印出兩種狀態下的訊息以及折扣後價格。


內嵌函數 Nested Functions

我們上述的方法我們都稱為全局函數(global functions),都是在全局的範圍下定義的,當然你也可以在 function中定義另一個 function ,這就叫內嵌函數。內嵌函數在默認情況下在外部是被隱藏起來的,但卻仍然可以通過包裹它們的 function 來調用它們。包裹的function也可以返回它內部的一個內嵌函數來在另外的範圍裡使用。

https://ithelp.ithome.com.tw/upload/images/20171230/201077011AhKQJOTcX.png


上一篇
Day-10 Swift 語法(6) - 動手做 Functions
下一篇
Day-12 Swift 語法(8) - Closures
系列文
Swift 菜鳥的30天30

尚未有邦友留言

立即登入留言