元组可以把多个值组合成一个复合值。 与数组不同,元组中的各个值不必是同一类型,而且元组一旦创建,大小就固定不变。
把用逗号分隔的值放进圆括号,就创建了一个元组:
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")]