元组是一种类型,它多个值组合在一个复合的值里面。元组中的值可以是任何类型,和元组中其他值的类型也不需要一样。
let http404Error = (404, "Not Found")
上面的例子中,(404, "Not Found")是一个描述HTTP状态值的元祖。HTTP状态值是当你访问Web页的时候Web服务器返回的特殊的值。404, "Not Found"这个状态值表示你请求的Web页面不存在。
(404, "Not Found")这个元组把一个Int类型的值和一个String类型值组合在了一起,给了HTTP状态值2个独立的值:一个数字和一个易于理解的的描述。它可以被描述一个type (Int, String)的元组。
你可以使用各种组合来创建一个元组,也可以包含你希望包含的所有你希望的不同的类型。没有什么可以阻止你创建一个(Int, Int, Int)的元组或者(String, Bool)的元组,当然也可以是其他你需要的类型的排列组合。
你可以把一个元组的内容分解成几个独立的常量或者变量,分解之后你可以像平常一样使用:
let (statusCode, statusMessage) = http404Error
print("The status code is \(statusCode)")
// 打印 "The status code is 404"
print("The status message is \(statusMessage)")
// 打印 "The status message is Not Found”
如果你需要的只是元组中的某一些值,那么就在你分解元组的时候使用下划线(_) 忽略不需要的那些部分。
let (justTheStatusCode, _) = http404Error
print("The status code is \(justTheStatusCode)")
// 打印 "The status code is 404”
还有另外一种方式可以访问元组的单个元素,就是使用索引,默认从0开始:
print("The status code is \(http404Error.0)")
// 打印 "The status code is 404"
print("The status message is \(http404Error.1)")
// 打印 "The status message is Not Found
在定义元组的时候可以定义每一个元素的名字:
let http200Status = (statusCode: 200, description: "OK")
如果你在元组中定义了元素的名字,那就可以使用元素的名字去访问这些元素的值:
print("The status code is \(http200Status.statusCode)")
// 打印 "The status code is 200"
print("The status message is \(http200Status.description)")
// 打印 "The status message is OK”
元组作为一个函数的返回值是很有用的,一个尝试获取web页的函数可以返回(Int, String)的元组去描述访问的成功或者失败。相比于返回单个数据,通过返回多个不同类型的且各自都表达了明确意思的值,函数可以根据结果提供很多的有用的信息。
NOTE:把多个相关联的数据组合成一个临时的数据组,那么使用元组是很合适的,但是不适合用元组构造出复杂的数据结构,如果你希望把你的数据结构持久的保存下来,那么使用类或者结构体把它模型化是更为合适的选择。