元組
元組(tuples)把多個(gè)值組合成一個(gè)復(fù)合值。元組內(nèi)的值可以是任意類型譬巫,并不要求是相同類型咖楣。
下面這個(gè)例子中,(404, "Not Found")
是一個(gè)描述 HTTP 狀態(tài)碼(HTTP status code)的元組缕题。HTTP 狀態(tài)碼是當(dāng)你請求網(wǎng)頁的時(shí)候 web 服務(wù)器返回的一個(gè)特殊值截歉。如果你請求的網(wǎng)頁不存在就會(huì)返回一個(gè) 404 Not Found
狀態(tài)碼胖腾。
let http404Error = (404, "Not Found")
// http404Error 的類型是 (Int, String)烟零,值是 (404, "Not Found")
(404, "Not Found")
元組把一個(gè) Int
值和一個(gè) String
值組合起來表示 HTTP 狀態(tài)碼的兩個(gè)部分:一個(gè)數(shù)字和一個(gè)人類可讀的描述。這個(gè)元組可以被描述為“一個(gè)類型為 (Int, String)
的元組”咸作。
你可以把任意順序的類型組合成一個(gè)元組锨阿,這個(gè)元組可以包含所有類型。只要你想记罚,你可以創(chuàng)建一個(gè)類型為 (Int, Int, Int)
或者 (String, Bool)
或者其他任何你想要的組合的元組墅诡。
你可以將一個(gè)元組的內(nèi)容分解(decompose)成單獨(dú)的常量和變量,然后你就可以正常使用它們了:
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"
如果你只需要一部分元組值桐智,分解的時(shí)候可以把要忽略的部分用下劃線(_
)標(biāo)記:
let (justTheStatusCode, _) = http404Error
print("The status code is \(justTheStatusCode)")
// 輸出 "The status code is 404"
此外末早,你還可以通過下標(biāo)來訪問元組中的單個(gè)元素,下標(biāo)從零開始:
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"
你可以在定義元組的時(shí)候給單個(gè)元素命名:
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"
作為函數(shù)返回值時(shí)然磷,元組非常有用。一個(gè)用來獲取網(wǎng)頁的函數(shù)可能會(huì)返回一個(gè) (Int, String)
元組來描述是否獲取成功刊驴。和只能返回一個(gè)類型的值比較起來姿搜,一個(gè)包含兩個(gè)不同類型值的元組可以讓函數(shù)的返回信息更有用。
數(shù)組
數(shù)組的簡單語法
寫 Swift 數(shù)組應(yīng)該遵循像Array
這樣的形式捆憎,其中Element
是這個(gè)數(shù)組中唯一允許存在的數(shù)據(jù)類型舅柜。我們也可以使用像[Element]
這樣的簡單語法。盡管兩種形式在功能上是一樣的躲惰,但是推薦較短的那種致份,而且在本文中都會(huì)使用這種形式來使用數(shù)組。
創(chuàng)建一個(gè)空數(shù)組
我們可以使用構(gòu)造語法來創(chuàng)建一個(gè)由特定數(shù)據(jù)類型構(gòu)成的空數(shù)組:
var someInts = [Int]()
print("someInts is of type [Int] with \(someInts.count) items.")
// 打印 "someInts is of type [Int] with 0 items."
注意础拨,通過構(gòu)造函數(shù)的類型氮块,someInts
的值類型被推斷為[Int]
瞬沦。
或者,如果代碼上下文中已經(jīng)提供了類型信息雇锡,例如一個(gè)函數(shù)參數(shù)或者一個(gè)已經(jīng)定義好類型的常量或者變量逛钻,我們可以使用空數(shù)組語句創(chuàng)建一個(gè)空數(shù)組,它的寫法很簡單:[]
(一對空方括號(hào)):
someInts.append(3)
// someInts 現(xiàn)在包含一個(gè) Int 值
someInts = []
// someInts 現(xiàn)在是空數(shù)組锰提,但是仍然是 [Int] 類型的曙痘。
創(chuàng)建一個(gè)帶有默認(rèn)值的數(shù)組
Swift 中的Array
類型還提供一個(gè)可以創(chuàng)建特定大小并且所有數(shù)據(jù)都被默認(rèn)的構(gòu)造方法。我們可以把準(zhǔn)備加入新數(shù)組的數(shù)據(jù)項(xiàng)數(shù)量(count
)和適當(dāng)類型的初始值(repeatedValue
)傳入數(shù)組構(gòu)造函數(shù):
var threeDoubles = [Double](repeatElement(0.0, count: 3))
// threeDoubles 是一種 [Double] 數(shù)組立肘,等價(jià)于 [0.0, 0.0, 0.0]
通過兩個(gè)數(shù)組相加創(chuàng)建一個(gè)數(shù)組
我們可以使用加法操作符(+
)來組合兩種已存在的相同類型數(shù)組边坤。新數(shù)組的數(shù)據(jù)類型會(huì)被從兩個(gè)數(shù)組的數(shù)據(jù)類型中推斷出來:
var anotherThreeDoubles = [Double](repeatElement(2.5, count: 3))
// anotherThreeDoubles 被推斷為 [Double],等價(jià)于 [2.5, 2.5, 2.5]
var sixDoubles = threeDoubles + anotherThreeDoubles
// sixDoubles 被推斷為 [Double]谅年,等價(jià)于 [0.0, 0.0, 0.0, 2.5, 2.5, 2.5]
利用下標(biāo)來一次改變一系列數(shù)據(jù)值茧痒,即使新數(shù)據(jù)和原有數(shù)據(jù)的數(shù)量是不一樣的。
var a = [1,2,3,4,5]
a[1...3] = [2]
print(a) // print: [1, 2, 5]
可以嵌套多對方括號(hào)來創(chuàng)建多維數(shù)組融蹂,最里面的方括號(hào)中指明數(shù)組元素的基本類型旺订。比如,下面例子中使用三對方括號(hào)創(chuàng)建三維整數(shù)數(shù)組:
var array3D: [[[Int]]] = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
字典
字典類型快捷語法
Swift 的字典使用Dictionary
定義超燃,其中Key
是字典中鍵的數(shù)據(jù)類型区拳,Value
是字典中對應(yīng)于這些鍵所存儲(chǔ)值的數(shù)據(jù)類型。
我們也可以用[Key: Value]
這樣快捷的形式去創(chuàng)建一個(gè)字典類型意乓。
創(chuàng)建一個(gè)空字典
我們可以像數(shù)組一樣使用構(gòu)造語法創(chuàng)建一個(gè)擁有確定類型的空字典:
var namesOfIntegers = [Int: String]()
// namesOfIntegers 是一個(gè)空的 [Int: String] 字典
我們也可以在字典中使用下標(biāo)語法來添加新的數(shù)據(jù)項(xiàng)樱调。可以使用一個(gè)恰當(dāng)類型的鍵作為下標(biāo)索引届良,并且分配恰當(dāng)類型的新值:
var dic = ["a": 0, "b": 2, "c" : 3]
dic["d"] = 4
print(dic) // print :["b": 2, "a": 0, "d": 4, "c": 3]