前言
繼Swift Review#15提到了所謂的拋出函式(throwing function),本文接著要談三種相似,卻又完全不相同的函式。
- 函式作為參數型別
- 函式作為返回型別
- 巢狀函式(nested function)
原則上,我們在過往所及的函式皆為全域函式(global function),意即:你今天只要寫好了某個函式,那它在你的編譯器中,都是可以被使用、應用的。
而第三者巢狀函式則有不同,如果我們要描述它的結構,可以暸解到:巢狀函式就是一個函式包著函式的狀態,裡面的函式只能被包在外部的函式應用,也可以被當作返回值返回其他地方使用。
以下將以上述所及的三個重點作為主要說明:
正文
1.函式作為參數
Well,函式作為參數這件事情,你大概就心裡有個底,函式的型別大概會是這樣:( )->( )、(Int)->(Int)……etc
這是一個很巧妙的設計,而在實例中,則如下:

你可以看到outsideFunction裡面承載了三個參數:第一個是someFunction、第二個是a ,第二個是b,而三者共同建構出打印的字串:”Result\(someFunction(a, b))”
這個時候,我們到外部來看,我們呼叫outsideFunction,然後就把三個參數個字塞了進去:insideFunction、4、50三個參數。
你看到了嗎?insideFunction可以這樣做為參數被使用的,但要記得它的型別!不然你就得debug了
2.函式作為返回型別
函式作為反回型別這件事情,跟上面的做為參數就不同了,因為返回型別是「傳回來的東西」,所以可以注意的事情則是這樣:

我們可以看到在someFunction這個函式,它參數型別設定是傳入布林值,傳出函式型別(Int)->Int,而這個函式要我們返回一個三元運算子的運算,
三元運算子的內容是這樣:假若Bools是true,則走returnFunctionA,false,則走returnFunctionB。
ok,這個時候下面的someFunction(number>0)就是一個比大小的機制,它拿number來比,結果就是大,結果為true。
下面true就傳入了finalFunction,既然傳入值是true,那勢必就選了returnFunctionA作為內部的另一個函式,所以這個時候,finalFunction(10)的10就是returnFunctionA的傳入參數了。
3.巢狀函式
如果將函式建立在另一個函式中,稱作巢狀函式(nested function
),被建立在其內的函式只能在裡面使用,也可以當做返回值返回以讓其他地方也可以使用
意即:我們在函式A裡面建構的另一個函式B,函式B只能在函式A裡使用,

巢狀函式的邏輯我就不再多說了,因為它大部分的程式碼跟2.函式作為返回值的部分是幾乎一模一樣的,只是把someFunction移到最前面,然後讓下面returnFunctionA、returnFunctionA兩者縮排到someFunction的作用域裡面。
這樣就可以知道,誰是這個函式的老大,誰是小弟。
綜合上述三者:
- 函式作為參數傳入,唯一要注意的就是傳入參數的型別要和要傳入的參式,型別要一樣。
- 函式作為返回型別,也同樣是注意返回參數型別是什麼?
- 巢狀函式則是要記得縮排,讓編寫程式的人知道誰是外面包著的函式,誰是在外面包著的函式作用域底下的函式。