iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 16
0

Functions

在寫 code 的時候發現,其實有些地方的 code 重複地出現,在維護程式碼的成本就會相對比較高,這時候就可以把這些重複的 code 抽出來,寫成一個 Function。

Functions 是一個獨立的程式碼區塊,只有在 Function 被呼叫的時候,才會執行裡面的程式碼。


建立 Function,呼叫 Function

我們來最簡單的 Function 組成:

func 方法名稱() {
	...
}

每個 Function 都必須以 func 開頭,然而要建立一個 Function,你必須替這個 Function 命名,這個命名規則跟宣告變數常數的規則是一樣的,唯一不一樣的是 Function 必須在命名後方加上 () ,並且在 {} 內加上你想要執行的程式,當然你也可以不加,但這也沒什麼意義。

func fly() {
	print("I can fly.")
}

fly() // Prints: I can fly.

在這邊 Function 的使用就很簡單,直接輸入 Function Name 加上 () 即可進行呼叫。

Function 參數與參數別名

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 的錯誤。/images/emoticon/emoticon13.gif

https://ithelp.ithome.com.tw/upload/images/20200916/20118283dM9asAMa5s.png

參數別名

在 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 除了可以被拉出來當成獨立程式碼來調用,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) 的回傳值,再來使用。


上一篇
Day 15 | Swift 流程控制:Guard
下一篇
Day 17 | Swift Functions (2)
系列文
給我 30 天,給你一輩子:Swift 從零開始30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言