函數 (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 |
沒有留言:
張貼留言