使用元祖打包数据
元组(tuples)可以把多个值组合成一个复合值。元组内的值可以是任意类型,并不要求是相同类型。
下面这个例子中, (404, "Not Found") 是一个描述 HTTP 状态码(HTTP status code)的元组。HTTP 状态码是当你请求网页的时候 web 服务器返回的一个特殊值。如果你请求的网页不存在就会返回一个404 Not Found 状态码。
let http404Error = (404, "Not Found")
// http404Error 的类型是 (Int, String),值是 (404, "Not Found")
(404, "Not Found") 元组把一个 Int 值和一个 String 值组合起来表示 HTTP 状态码的两个部分:一个数字和一个人类可读的描述。这个元组可以被描述为“一个类型为 (Int, String) 的元组”。
你可以把任意顺序的类型组合成一个元组,这个元组可以包含所有类型。只要你想,你可以创建一个类型为 (Int, Int, Int) 或者 (String, Bool) 或者其他任何你想要的组合的元组。
你可以将一个元组的内容分解(decompose)成单独的常量和变量,然后你就可以正常使用它们了:
// 定义一个 HTTP 状态码和描述的元祖,元祖类型为(Int, String)
let http404Error = (404, "Not Found")
// 1. 通过索引的方式访问元祖
http404Error.0
http404Error.1
// 2. 通过分解赋值成单独的常量或变量
let (statusCode, statusMessage) = http404Error
print("\(statusCode) ---- \(statusMessage)")
// 2.1 可以通过 _ 忽略不想要的值, 如元祖中的 "Not Found" 不需要使用到的情况下可以这样做
let (statusCode2, _) = http404Error
print(statusCode2)
我们还可以在定义元祖的时候单独给元祖中的元素命名, 以后即可通过该命名访问对应的元素
let http200Status = (statusCode: 200, description: "OK")
print("The status code is \(http200Status.statusCode)")
print("The status message is \(http200Status.description)")
元祖比较
当我们比较两个元祖类型的变量时,要遵循下面的规则:
首先,只有元素个数相同的元祖变量之间,才能进行比较。例如,下面的代码会引发编译错误:
let tuple12 = (1, 2)
let tuple123 = (1, 2, 3)
tuple2 < tuple3 // 编译报错
其次,当 Tuple 中元素个数相同时,比较是按照 Tuple 中元素的位置从前向后依次进行的:
如果 Tuple 中,相同位置的两个元素相等,则继续比较下一个位置的两个元素,并根据第一个同一位置不相等的两个元素的大小关系,确定两个 Tuple 变量的关系;
如果两个 Tuple 中所有位置的元素都相等,则两个 Tuple 变量相等;
因此,对于下面这个例子,tuple11 < tuple12 的结果是 true:
let tuple11 = (1, 1)
let tuple12 = (1, 2)
tuple11 < tuple12 // true
但是,有一点要说明的是,我们只可以对最多包含 6 个元素的 Tuple 变量进行比较,超过这个数量,Swift 会报错。例如对于下面这段代码:
let largeTuple1 = (1, 2, 3, 4, 5, 6, 7)
let largeTuple2 = (1, 2, 3, 4, 5, 6, 7)
largeTuple1 == largeTuple2 // Error !!!