Swift 中的元祖

使用元祖打包数据

元组(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 !!!

你可能感兴趣的:(Swift 中的元祖)