Swift 集合類型

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

集合操作


集合各種操作的結(jié)果

集合成員關(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嗽桩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子凄敢,更是在濱河造成了極大的恐慌碌冶,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涝缝,死亡現(xiàn)場(chǎng)離奇詭異扑庞,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)拒逮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門罐氨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人滩援,你說(shuō)我怎么就攤上這事栅隐。” “怎么了玩徊?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵租悄,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我佣赖,道長(zhǎng)恰矩,這世上最難降的妖魔是什么记盒? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任憎蛤,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘俩檬。我一直安慰自己萎胰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布棚辽。 她就那樣靜靜地躺著技竟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪屈藐。 梳的紋絲不亂的頭發(fā)上榔组,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音联逻,去河邊找鬼搓扯。 笑死,一個(gè)胖子當(dāng)著我的面吹牛包归,可吹牛的內(nèi)容都是我干的锨推。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼公壤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼换可!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起厦幅,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤沾鳄,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后确憨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洞渔,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年缚态,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了磁椒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡玫芦,死狀恐怖浆熔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情桥帆,我是刑警寧澤医增,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站老虫,受9級(jí)特大地震影響叶骨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜祈匙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一忽刽、第九天 我趴在偏房一處隱蔽的房頂上張望天揖。 院中可真熱鬧,春花似錦跪帝、人聲如沸今膊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)斑唬。三九已至,卻和暖如春黎泣,著一層夾襖步出監(jiān)牢的瞬間恕刘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工抒倚, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留雪营,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓衡便,卻偏偏與公主長(zhǎng)得像献起,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子镣陕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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

  • Swift 語(yǔ)言提供Arrays谴餐、Sets和Dictionaries三種基本的集合類型用來(lái)存儲(chǔ)集合數(shù)據(jù)。數(shù)組(Ar...
    窮人家的孩紙閱讀 563評(píng)論 3 2
  • 前言 3月27號(hào)蘋果發(fā)布了Swift3.1呆抑,官方教程也更新到了3.1岂嗓,查看更新記錄發(fā)現(xiàn)更新的內(nèi)容對(duì)之前的文章并沒(méi)有...
    BoomLee閱讀 3,137評(píng)論 0 4
  • 1 .數(shù)組 Arrays 數(shù)組使用有序列表存儲(chǔ)同一類型的多個(gè)值。相同的值可以多次出現(xiàn)在一個(gè)數(shù)組的不同位置中鹊碍。這和O...
    iceMaple閱讀 465評(píng)論 0 1
  • Cherish what you have at the moment. 且行且珍惜厌殉。
    天心火狐閱讀 230評(píng)論 0 0
  • 你還在生氣是嗎?感覺(jué)你還是有點(diǎn)不高興似的 我拒絕了你一次 所以你就開始記恨我么 今天雙十一也本來(lái)想給你買東西呢 可...
    小氣鬼丶Sue閱讀 150評(píng)論 0 0