Swift中的集合類型

Swift提供ArraysSetsDictionaries三種基本的集合類型用來(lái)存儲(chǔ)集合數(shù)據(jù)投剥。

1. 數(shù)組

數(shù)組使用有序列表存儲(chǔ)同一類型的多個(gè)值值漫,相同的值可以多次出現(xiàn)。

1.1 創(chuàng)建一個(gè)空數(shù)組

var someInts = [Int]()

1.2 創(chuàng)建一個(gè)帶有默認(rèn)值得數(shù)組

var threeDoubles = Array(repeating: 0.0, count: 3)
// 等價(jià)于[0.0, 0,0, 0.0]

1.3 通過(guò)兩個(gè)數(shù)組相加創(chuàng)建一個(gè)數(shù)組

var anotherThreeDoubles = Array(repeating: 2.5, count: 3)
var sixDoubles = threeDoubles + anotherThreeDoubles
// sixDoubles被推斷為[Double]

1.4 用數(shù)組字面量構(gòu)造數(shù)組

var shoppingList:[String] = ["Eggs", "Milk"]
// shoppingList已經(jīng)被構(gòu)造并且擁有兩個(gè)初始項(xiàng)

由于Swift的類型推斷機(jī)制椭蹄,當(dāng)我們用字面量構(gòu)造只擁有相同類型值數(shù)組的時(shí)候,可以省卻數(shù)組的類型:

var shoppingList = ["Eggs", "Milk"]

1.5 訪問(wèn)和修改數(shù)組

  • count:獲取數(shù)組中的元素?cái)?shù)目
  • isEmpty:檢查count是否為0
  • append(_:):在數(shù)組后面添加新的數(shù)據(jù)
  • insert(_:at:):在某個(gè)具體索引值之前添加數(shù)據(jù)項(xiàng)
  • remove(at:):移除數(shù)組中的某一項(xiàng)
  • removeLast():移除數(shù)組的最后一項(xiàng)

+=運(yùn)算符可以直接在數(shù)組后面添加一個(gè)或多個(gè)同類型的數(shù)據(jù)項(xiàng):

shoppingList += ["Baking Powder"]
shoppingList += ["Chocolate Spread", "Cheese", "Butter"]

我們可以通過(guò)下標(biāo)獲取或改變某個(gè)已有索引值對(duì)應(yīng)的數(shù)據(jù)净赴。
還可以利用下標(biāo)來(lái)一次改變一系列的數(shù)據(jù)值:

shoppingList[4..<6] = ["Bananas", "Apples"]

1.6 數(shù)組的遍歷

我們可以用for-in循環(huán)遍歷所有數(shù)組中的數(shù)據(jù)項(xiàng)绳矩。
如果我們同時(shí)需要每個(gè)數(shù)據(jù)項(xiàng)的值和索引值,可以使用enumerated()方法玖翅。enumerated()返回一個(gè)由每一個(gè)數(shù)據(jù)項(xiàng)索引值和數(shù)據(jù)值組成的元組:

for (index, value) in shoppingList.enumerated() {
    print("Item \(String(index + 1)): \(value)")
}

2. 集合

集合用來(lái)存儲(chǔ)相同類型并且沒(méi)有確定順序的值翼馆,集合內(nèi)的元素不能重復(fù)。

2.1 集合類型的哈希值

存儲(chǔ)在集合中的類型必須是可哈辖鸲龋化的应媚,Swift的所有基本類型(比如String,Int,DoubleBool)默認(rèn)都是可哈希化的猜极,沒(méi)有關(guān)聯(lián)值額枚舉成員值默認(rèn)也是可哈现薪化的。

你可以使用自定義的類型作為集合的值的類型或字典的鍵的類型跟伏,但需要使自定義類型符合Swift標(biāo)準(zhǔn)庫(kù)中的Hashable協(xié)議丢胚。符合Hashable協(xié)議的類型需要提供一個(gè)類型為Int的可讀屬性hashValue翩瓜。

2.2 集合類型語(yǔ)法

2.2.1 創(chuàng)建和構(gòu)造一個(gè)空的集合

var letters = Set<Character>()

2.2.2 用數(shù)組字面量創(chuàng)建集合

var favoriteGenres: Set<String> = ["Rock", "Classical", "Hip hop"]

2.2.3 訪問(wèn)和修改一個(gè)集合

  • count:返回Set中元素的數(shù)量
  • isEmpty:檢查count是否為0
  • insert(_:):添加一個(gè)新元素
  • remove(_:):刪除一個(gè)元素(如果Set不包含該值,返回nil)
  • removeAll():刪除所有元素
  • contains(_:):檢查Set中是否包含一個(gè)特定的值

2.2.4 遍歷一個(gè)集合

使用for-in遍歷一個(gè)集合携龟。
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")
}
// 按順序打印"Classical", "Hip hop", "Jazz"

2.3 集合操作

2.3.1 基本集合操作

  • intersection(_:):根據(jù)兩個(gè)集合中都包含的值創(chuàng)建一個(gè)新的集合
  • symmetricDifference(_:):根據(jù)在一個(gè)集合中但不在兩個(gè)集合中的值創(chuàng)建一個(gè)新集合
  • union(_:):根據(jù)兩個(gè)集合的值創(chuàng)建一個(gè)新集合
  • subtracting(_:):根據(jù)不在該集合中的值創(chuàng)建一個(gè)新集合
let oddDigits: Set = [1, 3, 5, 7, 9]
let evenDigits: Set = [0, 2, 4, 6, 8]
let singleDigitPrimeNumbers: Set = [2, 3, 5, 7]

oddDigits.union(evenDigits).sorted()
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

oddDigits.intersection(evenDigits).sorted()
// []

oddDigits.subtracting(singleDigitPrimeNumbers).sorted()
// [1, 9]

oddDigits.symmetricDifference(singleDigitPrimeNumbers).sorted()
// [1, 2, 9]

2.3.2 集合成員關(guān)系和相等

  • ==:判斷兩個(gè)集合是否相等
  • isSubset(of:):判斷一個(gè)集合中的值是否也被包含在另一個(gè)集合中
  • isStrictSubset(of:)/isStrictSuperset(of:):判斷一個(gè)集合是否是另一個(gè)集合的子集合/父集合并且兩個(gè)集合不相等
  • isDisjoint(with:):判斷那兩個(gè)集合是否有交集
let houseAnimals: Set = ["dog", "cat"]
let farmAnimals: Set = ["cow", "chicken", "sheep", "dog", "cat"]
let cityAnimals: Set = ["bird", "mouse"]

houseAnimals.isSubset(of: farmAnimals)
// true

farmAnimals.isSuperset(of: houseAnimals)
// true

farmAnimals.isDisjoint(with: cityAnimals)
// ture

3. 字典

字典是一種存儲(chǔ)多個(gè)相同類型的值得容器,字典中的數(shù)據(jù)項(xiàng)沒(méi)有具體順序层亿。

3.1 創(chuàng)建一個(gè)空字典

var namesOfIntegers = [Int: String]()

3.2 用字典字面量創(chuàng)建字典

var airports: [String: String] = ["XYZ": "Toronto Pearson", "DUB": "Dublin"]

var airports = ["XYZ": "Toronto Pearson", "DUB": "Dublin"]

3.3 訪問(wèn)和修改字典

同數(shù)組和集合一樣桦卒,字典同樣具有countisEmpty屬性匿又。
我們可以在字典中使用下表語(yǔ)法添加新的數(shù)據(jù)項(xiàng)方灾,或者改變特定鍵對(duì)應(yīng)的值。

airports["LHR"] = "London"
airports["LHR"] = "London Heathrow"

updateValue(_:forKey:)具有同樣的功能碌更,不同的是裕偿,這個(gè)方法返回更新值之前的原值,即對(duì)應(yīng)值的類型的可選值痛单。

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ǔ)法在字典中檢索特定鍵對(duì)應(yīng)的值嘿棘。

if let airportName = airports["DUB"] {
    print("The name of the airports is \(airportName)")
} else {
    print("That airport is not in the airports dictionary")
}
// 打印 "The name of the airports is Dublin Airport"

我們還可以使用下標(biāo)語(yǔ)法通過(guò)給某個(gè)鍵的對(duì)應(yīng)值賦值為nil來(lái)從字典里移除一個(gè)鍵值對(duì):

airports["APL"] = "Apple Internation"
airports["APL"] = nil

removeValue(forKey:)方法也可以用來(lái)移除鍵值對(duì),返回被移除的值或者在沒(méi)有值得情況下返回nil

if let removedValue = airports.removeValue(forKey: "DUB") {
    print("The removed airports name is \(removedValue)")
} else {
    print("The airports dictionary does not contain a value for DUB")
}
// prints "The removed airports name is Dublin Airport"

3.4 字典遍歷

除了for-in玄幻遍歷旭绒,我們也可以通過(guò)訪問(wèn)keys或者values屬性鸟妙,遍歷字典的鍵或者值:

Swift的字典類型是無(wú)序集合類型,為了以特定的順序遍歷字典的鍵或值挥吵,可以對(duì)字典的keysvalues屬性使用sorted()方法重父。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市忽匈,隨后出現(xiàn)的幾起案子房午,更是在濱河造成了極大的恐慌,老刑警劉巖丹允,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件郭厌,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡雕蔽,警方通過(guò)查閱死者的電腦和手機(jī)折柠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)萎羔,“玉大人液走,你說(shuō)我怎么就攤上這事〖窒荩” “怎么了缘眶?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)髓废。 經(jīng)常有香客問(wèn)我巷懈,道長(zhǎng),這世上最難降的妖魔是什么慌洪? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任顶燕,我火速辦了婚禮,結(jié)果婚禮上冈爹,老公的妹妹穿的比我還像新娘涌攻。我一直安慰自己,他們只是感情好频伤,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布恳谎。 她就那樣靜靜地躺著,像睡著了一般憋肖。 火紅的嫁衣襯著肌膚如雪因痛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天岸更,我揣著相機(jī)與錄音鸵膏,去河邊找鬼。 笑死怎炊,一個(gè)胖子當(dāng)著我的面吹牛谭企,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播评肆,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼赞咙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了糟港?” 一聲冷哼從身側(cè)響起攀操,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎秸抚,沒(méi)想到半個(gè)月后速和,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡剥汤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年颠放,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吭敢。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡碰凶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情欲低,我是刑警寧澤辕宏,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站砾莱,受9級(jí)特大地震影響瑞筐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜腊瑟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一聚假、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧闰非,春花似錦膘格、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至游岳,卻和暖如春政敢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背胚迫。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工喷户, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人访锻。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓褪尝,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親期犬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子河哑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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