元組可以把多個值群組起來,成為單一的複合值。和陣列不同,元組裡的值不必是相同的型別,而且元組一旦建立,大小就固定不變。
建立元組的方式,是把以逗號分隔的多個值放進括號裡:
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)")
}
你是聖誕老人物流部門的一名精靈,老闆交給你兩項任務,要升級系統的軟體。
系統需要能夠從資料庫中取得玩具的名稱。
資料庫是由(name: String, quantity: Int)型別的元組所組成。
請實作getName(_:)函式,它接收一個引數,該引數存放(name: String, quantity: Int)型別的元組。
let toy = (name: "Doll", quantity: 10)
getName(toy)
// Returns "Doll"
玩具市場瞬息萬變,熱門的商品變化得非常快。 因此,我們需要一個能建立新玩具的函式。
請實作createToy(name:amount:)函式,它接收引數name(存放玩具的名稱)與amount(存放玩具的數量)。
createToy(name: "Doll", amount: 10)
// Returns (name: "Doll", amount: 10)
聖誕老人工作坊裡的精靈不斷製作出更多玩具,而聖誕老人需要掌握每種玩具的數量。 為此,系統必須能夠更新資料庫中玩具的數量。
請實作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)]
聖誕老人希望能將資料庫中的玩具分類。 這樣一來,在需要送貨時就能輕鬆找到玩具,也能對資料庫中的玩具進行排序。
然而,系統最初建置時忘了加上分類鍵。 現在系統需要能夠為資料庫中的玩具加上分類鍵。
請實作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")]