使用元祖打包數據
元組(tuples)可以把多個值組合成一個復合值。元組內的值可以是任意類型,并不要求是相同類型。
下面這個例子中, (404, "Not Found") 是一個描述 HTTP 狀態(tài)碼(HTTP status code)的元組。HTTP 狀態(tài)碼是當你請求網頁的時候 web 服務器返回的一個特殊值。如果你請求的網頁不存在就會返回一個404 Not Found 狀態(tài)碼。
let http404Error = (404, "Not Found")
// http404Error 的類型是 (Int, String),值是 (404, "Not Found")
(404, "Not Found") 元組把一個 Int 值和一個 String 值組合起來表示 HTTP 狀態(tài)碼的兩個部分:一個數字和一個人類可讀的描述。這個元組可以被描述為“一個類型為 (Int, String) 的元組”。
你可以把任意順序的類型組合成一個元組,這個元組可以包含所有類型。只要你想,你可以創(chuàng)建一個類型為 (Int, Int, Int) 或者 (String, Bool) 或者其他任何你想要的組合的元組。
你可以將一個元組的內容分解(decompose)成單獨的常量和變量,然后你就可以正常使用它們了:
// 定義一個 HTTP 狀態(tài)碼和描述的元祖,元祖類型為(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)")
元祖比較
當我們比較兩個元祖類型的變量時,要遵循下面的規(guī)則:
首先,只有元素個數相同的元祖變量之間,才能進行比較。例如,下面的代碼會引發(fā)編譯錯誤:
let tuple12 = (1, 2)
let tuple123 = (1, 2, 3)
tuple2 < tuple3 // 編譯報錯
其次,當 Tuple 中元素個數相同時,比較是按照 Tuple 中元素的位置從前向后依次進行的:
如果 Tuple 中,相同位置的兩個元素相等,則繼續(xù)比較下一個位置的兩個元素,并根據第一個同一位置不相等的兩個元素的大小關系,確定兩個 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 !!!