集合類型
本節(jié)內(nèi)容包括:
Swift 語(yǔ)言里的數(shù)組和字典中存儲(chǔ)的數(shù)據(jù)值類型必須明確。
注意: Swift 的數(shù)組結(jié)構(gòu)在被聲明成常量和變量或者被傳入函數(shù)與方法中時(shí)會(huì)相對(duì)于其他類型展現(xiàn)出不同的特性岩喷。
<a name = "數(shù)組"></a>數(shù)組
Swift 數(shù)組特定于它所存儲(chǔ)元素的類型彰导。這與 Objective-C 的 NSArray 和 NSMutableArray 不同,這兩個(gè)類可以存儲(chǔ)任意類型的對(duì)象唐断,并且不提供所返回對(duì)象的任何特別信息费尽。在 Swift 中至会,數(shù)據(jù)值在被存儲(chǔ)進(jìn)入某個(gè)數(shù)組之前類型必須明確用含,方法是通過(guò)顯式的類型標(biāo)注或類型推斷矮慕,而且不是必須是class類型。例如: 如果我們創(chuàng)建了一個(gè)Int值類型的數(shù)組啄骇,我們不能往其中插入任何不是Int類型的數(shù)據(jù)痴鳄。 Swift 中的數(shù)組是類型安全的,并且它們中包含的類型必須明確缸夹。
數(shù)組的簡(jiǎn)單語(yǔ)法
寫(xiě) Swift 數(shù)組應(yīng)該遵循像Array<SomeType>這樣的形式痪寻,其中SomeType是這個(gè)數(shù)組中唯一允許存在的數(shù)據(jù)類型。 我們也可以使用像[SomeType]這樣的簡(jiǎn)單語(yǔ)法虽惭。
數(shù)組構(gòu)造語(yǔ)句
可以使用字面量來(lái)進(jìn)行數(shù)組構(gòu)造橡类,這是一種用一個(gè)或者多個(gè)數(shù)值構(gòu)造數(shù)組的簡(jiǎn)單方法。
var shoppingList: [String] = ["Eggs", "Milk"]
// shoppingList 已經(jīng)被構(gòu)造并且擁有兩個(gè)初始項(xiàng)趟妥。
//注意: Shoppinglist數(shù)組被聲明為變量(var關(guān)鍵字創(chuàng)建)而不是
//常量(let創(chuàng)建)是因?yàn)橐院罂赡軙?huì)有更多的數(shù)據(jù)項(xiàng)被插入其中猫态。
訪問(wèn)和修改數(shù)組
我們可以通過(guò)數(shù)組的方法和屬性來(lái)訪問(wèn)和修改數(shù)組,或者下標(biāo)語(yǔ)法。 還可以使用數(shù)組的只讀屬性count來(lái)獲取數(shù)組中的數(shù)據(jù)項(xiàng)數(shù)量。
println("The shopping list contains \(shoppingList.count) items.")
// 輸出"The shopping list contains 2 items."(這個(gè)數(shù)組有2個(gè)項(xiàng))
使用布爾項(xiàng)isEmpty
來(lái)作為檢查count
屬性的值是否為 0 的捷徑惨好。
if shoppingList.isEmpty {
println("The shopping list is empty.")
} else {
println("The shopping list is not empty.")
}
// 打印 "The shopping list is not empty."(shoppinglist不是空的)
也可以使用append
方法在數(shù)組后面添加新的數(shù)據(jù)項(xiàng):
shoppingList.append("Flour")
// shoppingList 現(xiàn)在有3個(gè)數(shù)據(jù)項(xiàng)埠巨,有人在攤煎餅
使用加法賦值運(yùn)算符(+=)也可以直接在數(shù)組后面添加一個(gè)或多個(gè)擁有相同類型的數(shù)據(jù)項(xiàng):
shoppingList += ["Baking Powder"]
// shoppingList 現(xiàn)在有四項(xiàng)了
shoppingList += ["Chocolate Spread","Cheese","Butter"]
// shoppingList 現(xiàn)在有七項(xiàng)了
數(shù)組的遍歷
我們可以使用for-in
循環(huán)來(lái)遍歷所有數(shù)組中的數(shù)據(jù)項(xiàng):
for item in shoppingList {
println(item)
}
for (index, value) in enumerate(shoppingList) {
println("Item \(String(index + 1)): \(value)")
}
<a name = "集合"></a>集合
集合用來(lái)存儲(chǔ)相同類型并且沒(méi)有確定順序的值。當(dāng)集合元素順序不重要時(shí)或者希望確保每個(gè)元素只出現(xiàn)一次時(shí)可以把集合當(dāng)做是數(shù)組另一形式虾标。
Set類型語(yǔ)法
Swift中的Set類型被寫(xiě)為Set<SomeType>,這里的SomeType表示Set中允許存儲(chǔ)的類型寓盗,和數(shù)組不同的是,集合沒(méi)有等價(jià)的簡(jiǎn)化形式璧函。
創(chuàng)建和構(gòu)造一個(gè)Set
可以通過(guò)構(gòu)造器語(yǔ)法創(chuàng)建一個(gè)特定類型的空集合:
var letters = Set<Character>()
集合與數(shù)組字面量
你可以使用一個(gè)數(shù)組字面量來(lái)構(gòu)造一個(gè)集合傀蚌,并且可以使用簡(jiǎn)化形式寫(xiě)一個(gè)或者多個(gè)值作為集合元素。
var favoriteGenres: Set<String> = ["Rock", "Classical", "Hip hop"]
一個(gè)Set類型不能從數(shù)組中字面量中獨(dú)立地被推斷出來(lái)蘸吓,因此Set類型必須顯式聲明善炫。然而,由于Swift的類型推導(dǎo)功能库继,如果你想使用一個(gè)數(shù)組字面量構(gòu)造一個(gè)Set并且該數(shù)組字面量中的所有元素類型相同箩艺,那么你無(wú)須寫(xiě)出Set的具體類型窜醉。
訪問(wèn)和修改一個(gè)Set
為了找出一個(gè)Set
中元素的數(shù)量,可以使用其只讀屬性count
:
println("I have \(favoriteGenres.count) favorite music genres.")
使用布爾屬性isEmpty
作為一個(gè)縮寫(xiě)形式去檢查count
屬性是否為0:
if favoriteGenres.isEmpty {
println("As far as music goes, I'm not picky.")
} else {
println("I have particular music preferences.")
}
你可以通過(guò)調(diào)用Set
的insert(_:)
方法添加一個(gè)新的元素:
favoriteGenres.insert("Jazz")
你可以通過(guò)調(diào)用Set
的remove(_:)
方法去刪除一個(gè)元素艺谆,如果該值是該Set
的一個(gè)元素則刪除該元素并且返回被刪除的元素值榨惰,否認(rèn)如果該Set
不包含該值,則返回nil
静汤。另外琅催,Set
中的所有元素可以通過(guò)它的removeAll()
方法刪除。
使用contains(_:)
方法去檢查Set
中是否包含一個(gè)特定的值虫给。
遍歷一個(gè)Set
你可以在一個(gè)for-in
循環(huán)中遍歷一個(gè)Set
中的所有值恢暖。
for genre in favoriteGenres {
println("\(value)")
}
Swift的Set類型沒(méi)有確定的順序,為了按照特定順序來(lái)遍歷一個(gè)Set中值可以使用全局sorted函數(shù)狰右,它將根據(jù)提供的序列返回一個(gè)排序的集合.
for genre in sorted(favoriteGenres) {
println("\(genre)")
}
完成集合操作
- 使用
union(_:)
方法根據(jù)兩個(gè)集合的值創(chuàng)建一個(gè)新的集合杰捂。 - 使用
subtract(_:)
方法根據(jù)不在該集合中的值創(chuàng)建一個(gè)新的集合。 - 使用
intersect(_:)
方法根據(jù)兩個(gè)集合中都包含的值創(chuàng)建的一個(gè)新的集合棋蚌。 - 使用
exclusiveOr(_:)
方法根據(jù)值在一個(gè)集合中但不在兩個(gè)集合中的值創(chuàng)建一個(gè)新的集合嫁佳。
Set類型的哈希值
為了存儲(chǔ)在集合中,該類型必須是可哈瞎饶海化的-也就是說(shuō)蒿往,該類型必須提供一個(gè)方法來(lái)計(jì)算它的哈希值。一個(gè)哈希值是Int類型的湿弦,它和其他的對(duì)象相同瓤漏,其被用來(lái)比較相等與否,比如a==b,它遵循的是a.hashValue == b.hashValue颊埃。
注意 你可以使用你自定義的類型作為集合的值或者是字典的鍵值類型蔬充,但你需要使你的自定義類型服從Swift標(biāo)準(zhǔn)庫(kù)中的Hashable協(xié)議。服從Hashable協(xié)議的類型需要提供一個(gè)類型為Int的取值訪問(wèn)器屬性hashValue班利。這個(gè)由類型的hashValue返回的值不需要在同一程序的不同執(zhí)行周期或者不同程序之間保持相同饥漫。 因?yàn)閔ashable協(xié)議服從于Equatable協(xié)議,所以遵循該協(xié)議的類型也必須提供一個(gè)"是否等"運(yùn)算符(==)的實(shí)現(xiàn)罗标。這個(gè)Equatable協(xié)議需要任何遵循的==的實(shí)現(xiàn)都是一種相等的關(guān)系庸队。也就是說(shuō),對(duì)于a,b,c三個(gè)值來(lái)說(shuō)闯割,==的實(shí)現(xiàn)必須滿足下面三種情況:
- a==a(自反性)
- a==b意味著b==a(對(duì)稱性)
- a==b&&b==c意味著a==c(傳遞性)
<a name = "字典"></a>字典
字典是一種存儲(chǔ)多個(gè)相同類型的值的容器彻消。每個(gè)值(value)都關(guān)聯(lián)唯一的鍵(key),鍵作為字典中的這個(gè)值數(shù)據(jù)的標(biāo)識(shí)符宙拉。
Swift 的字典使用時(shí)需要具體規(guī)定可以存儲(chǔ)鍵和值類型宾尚。不同于 Objective-C 的NSDictionary和NSMutableDictionary 類可以使用任何類型的對(duì)象來(lái)作鍵和值并且不提供任何關(guān)于這些對(duì)象的本質(zhì)信息。在 Swift 中鼓黔,在某個(gè)特定字典中可以存儲(chǔ)的鍵和值必須提前定義清楚央勒,方法是通過(guò)顯性類型標(biāo)注或者類型推斷不见。
Swift 的字典使用Dictionary<KeyType, ValueType>定義,其中KeyType是字典中鍵的數(shù)據(jù)類型,ValueType是字典中對(duì)應(yīng)于這些鍵所存儲(chǔ)值的數(shù)據(jù)類型崔步。
字典字面量
var airports: [String:String] = ["TYO": "Tokyo", "DUB": "Dublin"]
讀取和修改字典
我們可以通過(guò)字典的方法和屬性來(lái)讀取和修改字典稳吮,或者使用下標(biāo)語(yǔ)法。和數(shù)組一樣井濒,我們可以通過(guò)字典的只讀屬性count
來(lái)獲取某個(gè)字典的數(shù)據(jù)項(xiàng)數(shù)量:
println("The dictionary of airports contains \(airports.count) items.")
可以在字典中使用下標(biāo)語(yǔ)法來(lái)添加新的數(shù)據(jù)項(xiàng)
airports["LHR"] = "London"
也可以使用下標(biāo)語(yǔ)法來(lái)改變特定鍵對(duì)應(yīng)的值:
airports["LHR"] = "London Heathrow"
字典的updateValue(forKey:)方法可以設(shè)置或者更新特定鍵對(duì)應(yīng)的值灶似。
字典遍歷
我們可以使用for-in循環(huán)來(lái)遍歷某個(gè)字典中的鍵值對(duì)。每一個(gè)字典中的數(shù)據(jù)項(xiàng)都由(key, value)元組形式返回瑞你,并且我們可以使用臨時(shí)常量或者變量來(lái)分解這些元組:
for (airportCode, airportName) in airports {
println("\(airportCode): \(airportName)")
}
<a name = "集合的可變性"></a>集合的可變性
數(shù)組和字典都是在單個(gè)集合中存儲(chǔ)可變值酪惭。如果我們創(chuàng)建一個(gè)數(shù)組或者字典并且把它分配成一個(gè)變量,這個(gè)集合將會(huì)是可變的者甲。這意味著我們可以在創(chuàng)建之后添加更多或移除已存在的數(shù)據(jù)項(xiàng)來(lái)改變這個(gè)集合的大小春感。與此相反,如果我們把數(shù)組或字典分配成常量虏缸,那么它就是不可變的鲫懒,它的大小不能被改變。