學習軌道
/
Swift
Swift
/
練習
/
聖誕老人的 Swifty 小幫手
聖誕老人的 Swifty 小幫手

聖誕老人的 Swifty 小幫手

學習練習

簡介

元組可以把多個值群組起來,成為單一的複合值。和陣列不同,元組裡的值不必是相同的型別,而且元組一旦建立,大小就固定不變。

建立元組的方式,是把以逗號分隔的多個值放進括號裡:

let order = ("biscuits", 2.99, 3)

你也可以明確寫出型別標註:

let order: (String, Double, Int) = ("biscuits", 2.99, 3)

若要從未具名的元組中取出個別的元素,請使用從 0 開始的索引語法(.0、.1等):

let item = order.0     // "biscuits"
let quantity = order.2 // 3

具名元組

定義元組時,你可以為個別的元素命名:

let order = (item: "biscuits", price: 2.99, quantity: 3)

為元素命名能讓程式碼更容易閱讀,也能讓你用點號搭配標籤來存取元素:

let item = order.item         // "biscuits"
let quantity = order.quantity // 3

你也可以在型別標註裡加上元素名稱:

let order: (item: String, price: Double, quantity: Int) = (item: "biscuits", price: 2.99, quantity: 3)

修改元組

如果元組是以變數(var)宣告,就可以更新它的元素:

var order = ("biscuits", 2.99, 3)
order.0 = "cookies"
order.1 = 1.99
order.2 = 5

print(order)
// Prints ("cookies", 1.99, 5)

回傳多個值

雖然 Swift 函式只能回傳單一個值,但你可以把多個值打包成元組,讓函式回傳多個值:

func divide(_ dividend: Int, by divisor: Int) -> (quotient: Int, remainder: Int) {
    let quotient = dividend / divisor
    let remainder = dividend % divisor
    return (quotient, remainder)
}

let result = divide(14, by: 4)
print("Quotient: \(result.quotient), Remainder: \(result.remainder)")
// Prints "Quotient: 3, Remainder: 2"

元組解構

你可以把元組的值解構(拆解)成個別的常數或變數:

let order = ("biscuits", 2.99, 3)
let (item, price, quantity) = order

print(item) // Prints "biscuits"

元組解構也可以直接用在 for-in 迴圈裡:

let orders = [("biscuits", 2.99, 3), ("cookies", 1.99, 5)]

for (item, price, quantity) in orders {
    print("Item: \(item), Price: \(price), Quantity: \(quantity)")
}

說明

你是聖誕老人物流部門的一名精靈,老闆交給你兩項任務,要升級系統的軟體。

1. 取得玩具的名稱

系統需要能夠從資料庫中取得玩具的名稱。 資料庫是由(name: String, quantity: Int)型別的元組所組成。

請實作getName(_:)函式,它接收一個引數,該引數存放(name: String, quantity: Int)型別的元組。

let toy = (name: "Doll", quantity: 10)
getName(toy)
// Returns "Doll"

2. 將新玩具加入資料庫

玩具市場瞬息萬變,熱門的商品變化得非常快。 因此,我們需要一個能建立新玩具的函式。

請實作createToy(name:amount:)函式,它接收引數name(存放玩具的名稱)與amount(存放玩具的數量)。

createToy(name: "Doll", amount: 10)
// Returns (name: "Doll", amount: 10)

3. 更新玩具的數量

聖誕老人工作坊裡的精靈不斷製作出更多玩具,而聖誕老人需要掌握每種玩具的數量。 為此,系統必須能夠更新資料庫中玩具的數量。

請實作updateQuantity(_:toy:Amount:)函式,它接收以下引數:

  • toys:存放(name: String, quantity: Int)型別的元組陣列。
  • toy:要更新的玩具名稱。
  • amount:玩具的新數量。

你可以假設該玩具已經在資料庫中,不需要再檢查。

let toys = [(name: "Doll", quantity: 10), (name: "Car", quantity: 5), (name: "Train", quantity: 3)]
updateQuantity(toys, toy: "Doll", amount: 15)
// Returns [(name: "Doll", quantity: 15), (name: "Car", quantity: 5), (name: "Train", quantity: 3)]

4. 為玩具加上分類鍵

聖誕老人希望能將資料庫中的玩具分類。 這樣一來,在需要送貨時就能輕鬆找到玩具,也能對資料庫中的玩具進行排序。

然而,系統最初建置時忘了加上分類鍵。 現在系統需要能夠為資料庫中的玩具加上分類鍵。

請實作addCategory(_:category:)函式,它接收以下引數:

  • toys:存放(name: String, quantity: Int)型別的元組陣列。
  • category:要加到玩具上的分類鍵。

你可以假設該玩具已經在資料庫中,不需要再檢查。 你也可以假設該玩具還沒有任何分類鍵。

let toys = [(name: "Car", quantity: 5), (name: "Train", quantity: 3)]
addCategory(toys, category: "Vehicle")
// Returns [(name: "Car", quantity: 5, category: "Vehicle"), (name: "Train", quantity: 3, category: "Vehicle")]
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Swift Exercism

準備好開始 聖誕老人的 Swifty 小幫手 了嗎?

註冊 Exercism,透過 35 個概念116 個練習 和真人引導來學習並精通 Swift,全部免費。