
函數 (function) 是一種功能性的程式碼集合,可以將程式 (program) 分割成小部分,藉由呼叫 (call) 函數安排執行順序

定義函數使用關鍵字 (keyword) func ,之後空一格接函數的識別字 (identifier) 與小括弧,小括弧裡頭為參數列 (parameter list) ,如果是有回傳值 (return value) 的函數,就要再接 -> 符號,其後接回傳值型態 (return type) ,後面大括弧的內容則是函數工作區,也就是函數所要執行的任務。
參數跟回傳值都不是必須的,沒有參數的函數,就把小括弧留空,而沒有回傳值的函數就不需要 -> 跟回傳值型態。下例為沒有參數也沒有回傳值的函數
| func doSomething1() { |
| println("Hi") |
| } |
| doSomething1() |
doSomething1() 的工作內容就是呼叫 println() ,印出字串 (string) "Hi" 。輸入到 Playground ,結果如下

下例 doSomething2() 需要一個 Int 型態的參數,然後印出這個參數
| func doSomething2(a: Int) { |
| println(a) |
| } |
| doSomething2(22) |
輸入到 Playground 的結果如下

通常函數不會修改參數值,如果需要修改就需要把參數宣告為 inout ,並且呼叫時用 & 加上當作參數的變數之前。
下例 doSomething3() 需要一個 Int 型態的參數,然後回傳參數值
| func doSomething3(a: Int) -> Int { |
| return a |
| } |
| doSomething3(12) |
回傳數值要用到關鍵字 return , return 後面運算式的結果就是回傳值,函數內一旦執行到 return 就會結束函數的執行,並將控制權交還給呼叫的地方。
上例輸入到 Playground ,結果如下

小括弧的參數列可以放任意個數的參數,如下例參數數量增加為兩個
| func doSomething4(a: Int, b: Int) -> Int { |
| return a + b |
| } |
| doSomething4(23, 12) |
輸入到 Playground ,結果如下

回傳值的數量如果超過一個,就要把回傳值宣告為序對 (tuple) ,如下例
| func doSomething5(a: Int, b: Int) -> (Int, Int) { |
| return (a + b, a - b) |
| } |
| doSomething5(22, 21) |
輸入到 Playground ,結果如下

若要在呼叫函數時加上參數的提示識別字,好知道是哪個參數,就要在定義的地方加上外部參數名稱 (external parameter name) ,例如
| func join1(str s1: String, mark m: String) -> String { |
| return s1 + m |
| } |
| join1(str: "Hi", mark: ", ") |
參數前多了外部參數名稱的識別字,因此要加上這些識別字與冒號來呼叫,注意,參數列中參數的順序仍不可改變。
輸入到 Playground ,結果如下

如果外部參數名稱要跟參數一樣,就在參數前加上井字號就可以了,例如
| func join2(#s1: String, #m: String) -> String { |
| return s1 + m |
| } |
| join2(s1: "Hi", m: ", ") |
輸入到 Playground 後,結果如下

參數也可以有預設值,若要設定預設參數 (default parameter) ,定義時直接指派即可
| func join3(#s1: String, m: String = ", ") -> String { |
| return s1 + m |
| } |
| join3(s1: "Hi", m: "-") |
輸入到 Playground 後,結果如下

若是想要不限個數相同型態的參數,這叫做可變參數 (variadic parameter) ,在參數的型態名稱後接三個小數點,例如
| func sum(numbers: Int...) -> Int { |
| var total: Int = 0 |
| for n in numbers { |
| total += n |
| } |
| return total |
| } |
| sum(1, 2, 3, 4, 5) |
| sum(11, 22, 33, 44, 55) |
此例計算所有整數的總和,輸入到 Playground 後,結果如下

numbers 會是 Int 陣列 (array) , for-in 迴圈 (for-in loop) 會依序取出 numbers 中的值,也就是 Int 整數,累計到 total 之中,最後回傳 total 值。
函數的參數與回傳值也都能用函數,因為函數屬於函數型態 (function type) ,例如
| func mathFunction(f: (Int, Int) -> Int, a: Int, b: Int) { |
| println("The result is \(f(a, b)).") |
| } |
| mathFunction(doSomething4, 12, 33) |
此輸入到 Playground ,結果如下

此例的 mathFunction() 的第一個參數的型態為 (Int, Int) -> Int ,意思是需要兩個 Int 參數,然後回傳 Int 的函數型態,後兩個 Int 參數預計用作第一個函數參數的兩個 Int 參數,此函數直接在 println() 中的字串呼叫,留意須用反斜線及小括弧。
當作參數的函數還可以再簡化,這稱之為閉包 (closure) ,下個單元我們繼續討論閉包,閉包也可稱之為匿名函數 (anonymous function) 。
中英文術語對照
| 函數 | function |
| 程式 | program |
| 呼叫 | call |
| 關鍵字 | keyword |
| 識別字 | identifier |
| 參數列 | parameter list |
| 回傳值 | return value |
| 回傳值型態 | return type |
| 字串 | string |
| 序對 | tuple |
| 外部參數名稱 | external parameter name |
| 預設參數 | default parameter |
| 可變參數 | variadic parameter |
| 陣列 | array |
| for-in 迴圈 | for-in loop |
| 函數型態 | function type |
| 閉包 | closure |
| 匿名函數 | anonymous function |
沒有留言:
張貼留言
0.留言請選擇註冊帳號, Google 或 OpenID 均可
1.歡迎留言交流,但不歡迎垃圾留言及廣告留言
2.文章相關問題歡迎提出,請減少情緒性留言
3.非文章相關內容,請到 G+ 社群或 FB 社團提出
4.問作業之留言會被直接刪除
5.莫忘網路禮節
6.可使用部份HTML標記,如 <b> 、 <i> 、 <a>
7.站長保留刪除留言的權力