Swift 入門指南 V1.00 - 單元 7 - 函數




函數 (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)

回傳數值要用到關鍵字 returnreturn 後面運算式的結果就是回傳值,函數內一旦執行到 return 就會結束函數的執行,並將控制權交還給呼叫的地方。


上例輸入到 Playground ,結果如下



小括弧的參數列可以放任意個數的參數,如下例參數數量增加為兩個


func doSomething4(a: Int, b: Int) -> Int {
   return a + b
}
doSomething4(23, 12)

輸入到 Playground ,結果如下



回傳值的數量如果超過一個,就要把回傳值宣告為序對 (tuple) ,如下例


func doSomething5(a: Int, b: Int) -> (IntInt) {
   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: (IntInt) -> 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

沒有留言: