iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 17
0

上一篇提到了 Function 的種類,包含無回傳值以及有回傳值,以及參數別名或是省略參數的應用,這一篇要再來仔細探究一些細節,包含 Optional 的參數型態以及回傳值、可變動的參數型態,還有 Tuple 形式的回傳值...

單行表達式 Function

假使 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 { 體重 / (身高 * 身高) }

就看個人習慣,哪一種方式比較容易理解。

多回傳值的 Functions

在註明回傳值型別,可以是任何型別,所以我們除了可以使用基本型別,也可以使用集合型別,我們來看下面幾個例子:

  • Return Array
func getArrayResponse() -> Array<String> {
    return ["A", "B", "C"]
}

let arrayResponse = getArrayResponse()
for element in arrayResponse {
    print(element)
}

/*
Prints:
A
B
C
*/
  • Return Dictionary
func getDictionaryResponse() -> Dictionary<String, Int> {
    return ["套餐A": 100, "套餐B": 200, "套餐C": 300]
}

print(getDictionaryResponse())

// Prints: ["套餐A": 100, "套餐B": 200, "套餐C": 300]
  • Return Tuple
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 的方式來讀取每個值,比較理解回傳的每個參數的用途。

Optional 的參數或回傳值

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 來儲存。


上一篇
Day 16 | Swift Functions (1)
下一篇
Day 18 | Swift Closure
系列文
給我 30 天,給你一輩子:Swift 從零開始30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言