在寫 code 的時候發現,其實有些地方的 code 重複地出現,在維護程式碼的成本就會相對比較高,這時候就可以把這些重複的 code 抽出來,寫成一個 Function。
Functions 是一個獨立的程式碼區塊,只有在 Function 被呼叫的時候,才會執行裡面的程式碼。
我們來最簡單的 Function 組成:
func 方法名稱() {
...
}
每個 Function 都必須以 func
開頭,然而要建立一個 Function,你必須替這個 Function 命名,這個命名規則跟宣告變數常數的規則是一樣的,唯一不一樣的是 Function 必須在命名後方加上 ()
,並且在 {}
內加上你想要執行的程式,當然你也可以不加,但這也沒什麼意義。
func fly() {
print("I can fly.")
}
fly() // Prints: I can fly.
在這邊 Function 的使用就很簡單,直接輸入 Function Name
加上 ()
即可進行呼叫。
Function 可以接受帶入參數來作為輸入,在建立 Function 時,可以建立一個臨時常數,必須特別註明型別,來接收參數。
func 方法名稱(用來接收參數的常數: 型別) {
...
}
func 說你好(姓名: String) {
print("你好,\(姓名)")
}
說你好(姓名: "安竹") // 你好,安竹
說你好()
可以帶入一個字串,並指派給一個臨時常數 姓名
,就可以在 Function 中傳遞使用。
Functions 也允許使用多個參數來當作輸入,但這裡要注意的是,欲接收參數的常數命名,必須是唯一。
func 計算BMI(身高: Double, 體重: Double) {
print("你的 BMI 為 \(體重/(身高*身高))")
}
計算BMI(身高: 1.8, 體重: 75) // 你的 BMI 為 23.148148148148145
如果重複定義常數,編譯時會跳出 Definition conflicts with previous value
的錯誤。
在 Function 命名接收參數的常數時,可以使用別名的方式,在呼叫的時候,使用這個別名。
自定義的參數別名可以讓開發者在呼叫的時候,更清楚知道 Function 的使用,合乎語意,但參數還是指派給常數,所以在 Function 內要操作 input 的參數還是得用臨時常數,而非別名。
func 搭公車(到 地點: String) {
print("公車即將開往 \(地點)")
}
搭公車(到: "國父紀念館") // 公車即將開往 國父紀念館
還記得剛剛提到的,欲接收參數的常數命名,必須是唯一
,但是如果有使用別名的話,就可以重複。
func add(數值 x: Int, 數值 y: Int) {
print(x + y)
}
add(數值: 1, 數值: 3) // 4
還記得前面所提到的 說你好()
的範例,那個是沒有特別設定別名的 Function,在這種情況,參數別名就會是原本宣告的那個常數。
一般來說,在調用 function 的時候,假使有參數的情況下,你必須得打出那個參數的別名,如果你不想要再調用 Function 時省略參數別名時,你可以在欲接收常數的前面加上 _
,來看以下範例:
func 說你好(_ 姓名: String) {
print("你好,\(姓名)")
}
說你好("安竹") // 你好,安竹
在呼叫 Function 時,就可以省略參數別名,但是在這種情況你想在呼叫時加上參數別名,是不允許的,他就是必須得忽略。
在建立 Function 時,我們可以給予參數初始值,所以在呼叫的時候,如果沒有特別輸入該參數,他就會拿初始值來使用。
func 搭客運(從 出發點: String, 到 終點: String = "圓山") {
print("我要從 \(出發點) 搭到 \(終點)")
}
搭客運(從: "羅東") // 我要從 羅東 搭到 圓山
搭客運(從: "羅東", 到: "南港") // 我要從 羅東 搭到 南港
在呼叫的時候,如果沒特別輸入到哪裡,預設終點就會被指派為 圓山
,但如果有別輸入終點為 南港
,在調用的時候終點就會變為南港。
Function 除了可以被拉出來當成獨立程式碼來調用,Function 本身都具有回傳值得功能,在上述這些例子,都是屬於無回傳值的方法
,還有另一種就是有回傳值的方法
。
但是無回傳值的方法,並不是真的不具有回傳值,他還是會回傳一個東西,()
,他會返回一個 Void 類型的值,他是一個空 Tuple,所以你也可以改寫成這樣:
func 說你好(姓名: String) -> () {
print("你好,\(姓名)")
}
說你好(姓名: "安竹") // 你好,安竹
這種方式的 說你好()
跟上面的範例是一模一樣的,都是 Void Function。
那可以看到上面的例子,我們可以使用 -> 型別
來指定 Function 必須回傳什麼類型的數值,所以我們就用 計算BMI()
的那個範例來改寫一下:
func 計算BMI(身高: Double, 體重: Double) -> Double {
return 體重 / (身高 * 身高)
}
let myBMI = 計算BMI(身高: 1.8, 體重: 75)
print("我的 BMI 為 \(myBMI)")
我們指定返還值必須為一個 Double 的數值,所以在 Function 中就得使用 return
來回傳計算後的 BMI 數值,因為全部的參數型別都是 Double 所以在執行運算的時候會自動推論該結果也是一個 Double 型別的數值。
宣告一個常數 myBMI
來接收 計算BMI(身高: 1.8, 體重: 75)
的回傳值,再來使用。