Swift 語(yǔ)言提供Arrays跺撼、Sets和Dictionaries三種基本的集合類型用來(lái)存儲(chǔ)集合數(shù)據(jù)无蜂。數(shù)組(Arrays)是有序數(shù)據(jù)的集抓狭。集合(Sets)是無(wú)序無(wú)重復(fù)數(shù)據(jù)的集枕荞。字典(Dictionaries)是無(wú)序的鍵值對(duì)的集。Swift 語(yǔ)言中的Arrays碎连、Sets和Dictionaries中存儲(chǔ)的數(shù)據(jù)值類型必須明確灰羽。這意味著我們不能把不正確的數(shù)據(jù)類型插入其中。同時(shí)這也說(shuō)明我們完全可以對(duì)取回值的類型非常自信鱼辙。
集合的可變性
如果創(chuàng)建一個(gè)Arrays廉嚼、Sets或Dictionaries并且把它分配成一個(gè)變量,這個(gè)集合將會(huì)是可變的倒戏。這意味著我們可以在創(chuàng)建之后添加更多或移除已存在的數(shù)據(jù)項(xiàng)怠噪,或者改變集合中的數(shù)據(jù)項(xiàng)。如果我們把Arrays杜跷、Sets或Dictionaries分配成常量傍念,那么它就是不可變的,它的大小和內(nèi)容都不能被改變葛闷。
數(shù)組(Arrays)
寫 Swift 數(shù)組應(yīng)該遵循像Array<Element>這樣的形式憋槐,其中Element是這個(gè)數(shù)組中唯一允許存在的數(shù)據(jù)類型。我們也可以使用像[Element]這樣的簡(jiǎn)單語(yǔ)法孵运。
創(chuàng)建數(shù)組
可以使用構(gòu)造語(yǔ)法來(lái)創(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."
someInts.append(3)
// someInts 現(xiàn)在包含一個(gè) Int 值
someInts = []
// someInts 現(xiàn)在是空數(shù)組秦陋,但是仍然是 [Int] 類型的蔓彩。
Swift 中的Array類型還提供一個(gè)可以創(chuàng)建特定大小并且所有數(shù)據(jù)都被默認(rèn)的構(gòu)造方法治笨。我們可以把準(zhǔn)備加入新數(shù)組的數(shù)據(jù)項(xiàng)數(shù)量(count)和適當(dāng)類型的初始值(repeating)傳入數(shù)組構(gòu)造函數(shù)
var threeDoubles = Array(repeating: 0.0, count: 3)
// threeDoubles 是一種 [Double] 數(shù)組,等價(jià)于 [0.0, 0.0, 0.0]
可以使用加法操作符(+)來(lái)組合兩種已存在的相同類型數(shù)組赤嚼。新數(shù)組的數(shù)據(jù)類型會(huì)被從兩個(gè)數(shù)組的數(shù)據(jù)類型中推斷出來(lái)
var anotherThreeDoubles = Array(repeating: 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]
可以使用數(shù)組字面量來(lái)進(jìn)行數(shù)組構(gòu)造更卒,這是一種用一個(gè)或者多個(gè)數(shù)值構(gòu)造數(shù)組的簡(jiǎn)單方法等孵。數(shù)組字面量是一系列由逗號(hào)分割并由方括號(hào)包含的數(shù)值 [value 1, value 2, value 3]
var shoppingList = ["Eggs", "Milk"]
// shoppingList 已經(jīng)被構(gòu)造并且擁有兩個(gè)初始項(xiàng)。
訪問(wèn)和修改數(shù)組
可以使用數(shù)組的只讀屬性count來(lái)獲取數(shù)組中的數(shù)據(jù)項(xiàng)數(shù)量
使用布爾屬性isEmpty作為一個(gè)縮寫形式去檢查count屬性是否為0
也可以使用append(_:)方法在數(shù)組后面添加新的數(shù)據(jù)項(xiàng)
使用下標(biāo)語(yǔ)法來(lái)獲取數(shù)組中的數(shù)據(jù)項(xiàng)蹂空,把我們需要的數(shù)據(jù)項(xiàng)的索引值放在直接放在數(shù)組名稱的方括號(hào)中
可以用下標(biāo)來(lái)改變某個(gè)已有索引值對(duì)應(yīng)的數(shù)據(jù)值
還可以利用下標(biāo)來(lái)一次改變一系列數(shù)據(jù)值俯萌,即使新數(shù)據(jù)和原有數(shù)據(jù)的數(shù)量是不一樣的果录。下面的例子把"Chocolate Spread","Cheese"咐熙,和"Butter"替換為"Bananas"和"Apples"
shoppingList[4...6] = ["Bananas", "Apples"]
// shoppingList 現(xiàn)在有6項(xiàng)
調(diào)用數(shù)組的insert(_:at:)方法來(lái)在某個(gè)具體索引值之前添加數(shù)據(jù)項(xiàng)
使用remove(at:)方法來(lái)移除數(shù)組中的某一項(xiàng)弱恒。這個(gè)方法把數(shù)組在特定索引值中存儲(chǔ)的數(shù)據(jù)項(xiàng)移除并且返回這個(gè)被移除的數(shù)據(jù)項(xiàng)(我們不需要的時(shí)候就可以無(wú)視它)
如果我們只想把數(shù)組中的最后一項(xiàng)移除,可以使用removeLast()方法而不是remove(at:)方法來(lái)避免我們需要獲取數(shù)組的count屬性棋恼。就像后者一樣返弹,前者也會(huì)返回被移除的數(shù)據(jù)項(xiàng)
數(shù)組的遍歷
可以使用for-in循環(huán)來(lái)遍歷所有數(shù)組中的數(shù)據(jù)項(xiàng)
如果我們同時(shí)需要每個(gè)數(shù)據(jù)項(xiàng)的值和索引值,可以使用enumerated()方法來(lái)進(jìn)行數(shù)組遍歷爪飘。enumerated()返回一個(gè)由每一個(gè)數(shù)據(jù)項(xiàng)索引值和數(shù)據(jù)值組成的元組义起。我們可以把這個(gè)元組分解成臨時(shí)常量或者變量來(lái)進(jìn)行遍歷
for (index, value) in shoppingList.enumerated() {
? ? print("Item \(String(index + 1)): \(value)")
}
集合(Sets)
Swift 中的Set類型被寫為Set,這里的Element表示Set中允許存儲(chǔ)的類型师崎,和數(shù)組不同的是默终,集合沒(méi)有等價(jià)的簡(jiǎn)化形式。
創(chuàng)建集合
可以通過(guò)構(gòu)造器語(yǔ)法創(chuàng)建一個(gè)特定類型的空集合
var letters = Set()
print("letters is of type Setwith \(letters.count) items.")
// 打印 "letters is of type Setwith 0 items."
letters.insert("a")
// letters 現(xiàn)在含有1個(gè) Character 類型的值
letters = []
// letters 現(xiàn)在是一個(gè)空的 Set, 但是它依然是 Set類型
可以使用數(shù)組字面量來(lái)構(gòu)造集合抡诞,并且可以使用簡(jiǎn)化形式寫一個(gè)或者多個(gè)值作為集合元素
var favoriteGenres: Set = ["Rock", "Classical", "Hip hop"]
// favoriteGenres 被構(gòu)造成含有三個(gè)初始值的集合
一個(gè)Set類型不能從數(shù)組字面量中被單獨(dú)推斷出來(lái)穷蛹,因此Set類型必須顯式聲明。然而昼汗,由于 Swift 的類型推斷功能肴熏,如果你想使用一個(gè)數(shù)組字面量構(gòu)造一個(gè)Set并且該數(shù)組字面量中的所有元素類型相同,那么你無(wú)須寫出Set的具體類型顷窒。favoriteGenres的構(gòu)造形式可以采用簡(jiǎn)化的方式代替
var favoriteGenres: Set = ["Rock", "Classical", "Hip hop"]
訪問(wèn)和修改集合
可以使用其只讀屬性count找出一個(gè)Set中元素的數(shù)量
使用布爾屬性isEmpty作為一個(gè)縮寫形式去檢查count屬性是否為0
通過(guò)調(diào)用Set的insert(_:)方法來(lái)添加一個(gè)新元素
通過(guò)調(diào)用Set的remove(_:)方法去刪除一個(gè)元素蛙吏,如果該值是該Set的一個(gè)元素則刪除該元素并且返回被刪除的元素值,否則如果該Set不包含該值鞋吉,則返回nil鸦做。另外,Set中的所有元素可以通過(guò)它的removeAll()方法刪除
使用contains(_:)方法去檢查Set中是否包含一個(gè)特定的值
集合的遍歷
可以在一個(gè)for-in循環(huán)中遍歷一個(gè)Set中的所有值
Swift 的Set類型沒(méi)有確定的順序谓着,為了按照特定順序來(lái)遍歷一個(gè)Set中的值可以使用sorted()方法泼诱,它將返回一個(gè)有序數(shù)組,這個(gè)數(shù)組的元素排列順序由操作符'<'對(duì)元素進(jìn)行比較的結(jié)果來(lái)確定
for genre in favoriteGenres.sorted() {
? ? print("\(genre)")
}
// prints "Classical"
// prints "Hip hop"
// prints "Jazz
集合操作
集合成員關(guān)系和相等
使用“是否相等”運(yùn)算符(==)來(lái)判斷兩個(gè)集合是否包含全部相同的值赊锚。
使用isSubset(of:)方法來(lái)判斷一個(gè)集合中的值是否也被包含在另外一個(gè)集合中治筒。
使用isSuperset(of:)方法來(lái)判斷一個(gè)集合中包含另一個(gè)集合中所有的值。
使用isStrictSubset(of:)或者isStrictSuperset(of:)方法來(lái)判斷一個(gè)集合是否是另外一個(gè)集合的子集合或者父集合并且兩個(gè)集合并不相等舷蒲。
使用isDisjoint(with:)方法來(lái)判斷兩個(gè)集合是否不含有相同的值(是否沒(méi)有交集)耸袜。
字典(Dictionaries)
Swift 的字典使用Dictionary定義,其中Key是字典中鍵的數(shù)據(jù)類型牲平,Value是字典中對(duì)應(yīng)于這些鍵所存儲(chǔ)值的數(shù)據(jù)類型堤框。我們也可以用[Key: Value]這樣簡(jiǎn)化的形式去創(chuàng)建一個(gè)字典類型。
創(chuàng)建字典
可以像數(shù)組一樣使用構(gòu)造語(yǔ)法創(chuàng)建一個(gè)擁有確定類型的空字典
var namesOfIntegers = [Int: String]()
// namesOfIntegers 是一個(gè)空的 [Int: String] 字典
namesOfIntegers[16] = "sixteen"
// namesOfIntegers 現(xiàn)在包含一個(gè)鍵值對(duì)
namesOfIntegers = [:]
// namesOfIntegers 又成為了一個(gè) [Int: String] 類型的空字典
可以使用字典字面量來(lái)構(gòu)造字典,這和我們剛才介紹過(guò)的數(shù)組字面量擁有相似語(yǔ)法蜈抓。字典字面量是一種將一個(gè)或多個(gè)鍵值對(duì)寫作Dictionary集合的快捷途徑启绰。
var airports = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]
訪問(wèn)和修改字典
通過(guò)字典的只讀屬性count來(lái)獲取某個(gè)字典的數(shù)據(jù)項(xiàng)數(shù)量
使用布爾屬性isEmpty作為一個(gè)縮寫形式去檢查count屬性是否為0
可以在字典中使用下標(biāo)語(yǔ)法來(lái)添加新的數(shù)據(jù)項(xiàng)」凳梗可以使用一個(gè)恰當(dāng)類型的鍵作為下標(biāo)索引酬土,并且分配恰當(dāng)類型的新值
也可以使用下標(biāo)語(yǔ)法來(lái)改變特定鍵對(duì)應(yīng)的值
字典的updateValue(_:forKey:)方法可以設(shè)置或者更新特定鍵對(duì)應(yīng)的值,在這個(gè)鍵不存在對(duì)應(yīng)值的時(shí)候會(huì)設(shè)置新值或者在存在時(shí)更新已存在的值格带,返回更新值之前的原值
if let oldValue = airports.updateValue("Dublin Airport", forKey: "DUB") {
? ? print("The old value for DUB was \(oldValue).")
}
// 輸出 "The old value for DUB was Dublin."
可以使用下標(biāo)語(yǔ)法來(lái)在字典中檢索特定鍵對(duì)應(yīng)的值撤缴。因?yàn)橛锌赡苷?qǐng)求的鍵沒(méi)有對(duì)應(yīng)的值存在,字典的下標(biāo)訪問(wèn)會(huì)返回對(duì)應(yīng)值的類型的可選值叽唱。如果這個(gè)字典包含請(qǐng)求鍵所對(duì)應(yīng)的值屈呕,下標(biāo)會(huì)返回一個(gè)包含這個(gè)存在值的可選值,否則將返回nil
if let airportName = airports["DUB"] {
? ? print("The name of the airport is \(airportName).")
} else {
? ? print("That airport is not in the airports dictionary.")
}
// 打印 "The name of the airport is Dublin Airport."
可以使用下標(biāo)語(yǔ)法來(lái)通過(guò)給某個(gè)鍵的對(duì)應(yīng)值賦值為nil來(lái)從字典里移除一個(gè)鍵值對(duì)
airports["APL"] = "Apple Internation"
// "Apple Internation" 不是真的 APL 機(jī)場(chǎng), 刪除它
airports["APL"] = nil
// APL 現(xiàn)在被移除了
removeValue(forKey:)方法也可以用來(lái)在字典中移除鍵值對(duì)棺亭。這個(gè)方法在鍵值對(duì)存在的情況下會(huì)移除該鍵值對(duì)并且返回被移除的值或者在沒(méi)有值的情況下返回nil
if let removedValue = airports. removeValue(forKey: "DUB") {
? ? print("The removed airport's name is \(removedValue).")
} else {
? ? print("The airports dictionary does not contain a value for DUB.")
}
// prints "The removed airport's name is Dublin Airport."
字典的遍歷
可以使用for-in循環(huán)來(lái)遍歷某個(gè)字典中的鍵值對(duì)虎眨。每一個(gè)字典中的數(shù)據(jù)項(xiàng)都以(key, value)元組形式返回,并且我們可以使用臨時(shí)常量或者變量來(lái)分解這些元組
通過(guò)訪問(wèn)keys或者values屬性镶摘,我們也可以遍歷字典的鍵或者值
for airportCode in airports.keys {
? ? print("Airport code: \(airportCode)")
}
// Airport code: YYZ
// Airport code: LHR
for airportName in airports.values {
? ? print("Airport name: \(airportName)")
}
// Airport name: Toronto Pearson
// Airport name: London Heathrow