集合類型

集合類型

本節(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)用Setinsert(_:)方法添加一個(gè)新的元素:

favoriteGenres.insert("Jazz")

你可以通過(guò)調(diào)用Setremove(_:)方法去刪除一個(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ù)組或字典分配成常量虏缸,那么它就是不可變的鲫懒,它的大小不能被改變。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末刽辙,一起剝皮案震驚了整個(gè)濱河市窥岩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宰缤,老刑警劉巖颂翼,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異慨灭,居然都是意外死亡朦乏,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門缘挑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)集歇,“玉大人,你說(shuō)我怎么就攤上這事语淘。” “怎么了际歼?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵惶翻,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我鹅心,道長(zhǎng)吕粗,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任旭愧,我火速辦了婚禮颅筋,結(jié)果婚禮上宙暇,老公的妹妹穿的比我還像新娘。我一直安慰自己议泵,他們只是感情好占贫,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著先口,像睡著了一般型奥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上碉京,一...
    開(kāi)封第一講書(shū)人閱讀 52,441評(píng)論 1 310
  • 那天厢汹,我揣著相機(jī)與錄音,去河邊找鬼谐宙。 笑死烫葬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的凡蜻。 我是一名探鬼主播搭综,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼咽瓷!你這毒婦竟也來(lái)了设凹?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤茅姜,失蹤者是張志新(化名)和其女友劉穎闪朱,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體钻洒,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡奋姿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了素标。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片称诗。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖头遭,靈堂內(nèi)的尸體忽然破棺而出寓免,到底是詐尸還是另有隱情,我是刑警寧澤计维,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布袜香,位于F島的核電站,受9級(jí)特大地震影響鲫惶,放射性物質(zhì)發(fā)生泄漏蜈首。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望欢策。 院中可真熱鬧吆寨,春花似錦、人聲如沸踩寇。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)姑荷。三九已至盒延,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鼠冕,已是汗流浹背添寺。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留懈费,地道東北人计露。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像憎乙,于是被迫代替她去往敵國(guó)和親票罐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • [The Swift Programming Language 中文版]本頁(yè)包含內(nèi)容: Swift 語(yǔ)言提供Arr...
    風(fēng)林山火閱讀 470評(píng)論 0 1
  • 前言 3月27號(hào)蘋(píng)果發(fā)布了Swift3.1泞边,官方教程也更新到了3.1该押,查看更新記錄發(fā)現(xiàn)更新的內(nèi)容對(duì)之前的文章并沒(méi)有...
    BoomLee閱讀 3,147評(píng)論 0 4
  • Swift 語(yǔ)言提供Arrays、Sets和Dictionaries三種基本的集合類型用來(lái)存儲(chǔ)集合數(shù)據(jù)阵谚。數(shù)組(Ar...
    窮人家的孩紙閱讀 569評(píng)論 3 2
  • 由蘋(píng)果官網(wǎng)翻譯得來(lái)fork自https://github.com/letsswift/The-Swift-Prog...
    佛祖拿屠刀閱讀 427評(píng)論 0 1
  • 天堂沒(méi)有壞人梢什,佛祖也有童心 這是女兒剛才說(shuō)的奠蹬。 女兒和我做游戲,因?yàn)樾睦锵胫聝何宋纾圆粔驅(qū)P亩谠辏?dāng)她施施然緩步到來(lái)...
    寧境寧閱讀 1,273評(píng)論 16 17