上一篇提到了 Function 的種類,包含無回傳值
以及有回傳值
,以及參數別名或是省略參數的應用,這一篇要再來仔細探究一些細節,包含 Optional 的參數型態以及回傳值、可變動的參數型態,還有 Tuple 形式的回傳值...
假使 Function 有註明必須回傳資料時,就必須使用 return 來回傳值,但是也不是每次都要加上 return。
可以從 Swift-Evolution 的 SE-0255 了解到,從 Swift 5.1
之後,Function 中若是只有單行程式碼時,此為 Single-Expression Functions ,Swift 會預設將那一行程式當作回傳值,即可省略 return
這個關鍵字。
func 計算BMI(身高: Double, 體重: Double) -> Double {
體重 / (身高 * 身高)
}
print("我的 BMI 為 \(計算BMI(身高: 1.8, 體重: 75))")
開頭也提到,只有在有回傳值時,才符合這種方式,假使回傳 Void
,則不會遵循這個規則。
像是這種 Single-Expression Functions,也可以寫成這樣:
func 計算BMI(身高: Double, 體重: Double) -> Double { 體重 / (身高 * 身高) }
就看個人習慣,哪一種方式比較容易理解。
在註明回傳值型別,可以是任何型別,所以我們除了可以使用基本型別,也可以使用集合型別,我們來看下面幾個例子:
func getArrayResponse() -> Array<String> {
return ["A", "B", "C"]
}
let arrayResponse = getArrayResponse()
for element in arrayResponse {
print(element)
}
/*
Prints:
A
B
C
*/
func getDictionaryResponse() -> Dictionary<String, Int> {
return ["套餐A": 100, "套餐B": 200, "套餐C": 300]
}
print(getDictionaryResponse())
// Prints: ["套餐A": 100, "套餐B": 200, "套餐C": 300]
func getHttpReponse() -> (Int, String) {
(200, "OK")
}
let httpResponse = getHttpReponse()
print("Http Status Code: \(httpResponse.0)")
// Http Status Code: 200
print("Http Status: \(httpResponse.1)")
// Http Status: OK
還記得《 Day 3 | Swift 基本型別 》提到,可以建立一個別名,來取代這種 index 方式,比較容易了解程式碼的意圖。
func getHttpReponse() -> (httpStatusCode: Int, httpStatus: String) {
(200, "OK")
}
let httpResponse = getHttpReponse()
print("Http Status Code: \(httpResponse.httpStatusCode)")
// Http Status Code: 200
print("Http Status: \(httpResponse.httpStatus)")
// Http Status: OK
在回傳值給予每個值一個名稱,在呼叫的時候就不必使用 index 的方式來讀取每個值,比較理解回傳的每個參數的用途。
Function 的參數及回傳值允許任何型別,也意味著允許 Optional 型別的資料,我們來看下面這個範例:
func convertStringToInt(value: String? = nil) -> Int? {
guard let stringValue = value else { return nil }
return Int(stringValue)
}
這是一個 字串轉整數 的方法,我們在一開始就指定參數初始值為 nil,以確保 value 輸入可能是無值的情況,在回傳值也設定為 Optional 型別,以防型別轉換的結果為 nil。
可變動形式的參數代表可以接受零個或是多個同型別的資料,如果是多個資料的輸入,這個參數就會被視為是一個 Array,使用的方法就是在註記參數型別的後方加入 ...
。
func 計算平均數(數值 value: Int...) -> Double {
if value.isEmpty { return 0 }
let doubleArray = value
return Double(doubleArray.reduce(0, +)) / Double(doubleArray.count)
}
print(計算平均數()) // 0
print(計算平均數(數值: 100)) // 100.0
print(計算平均數(數值: 1, 3, 5)) // 3.0
上面這個例子我們可以看到,允許參數輸入可以從 0
個、1
個甚至是多個,並且參數型態會是以 Array 來儲存。