Swift Collections簡單使用

什么是Swift Collections凿将?

Swift Collections是一個新(2021年4月5日)的開源程序包训貌,旨在將Swift程序員可用的數(shù)據(jù)結(jié)構(gòu)的選擇范圍擴(kuò)展到標(biāo)準(zhǔn)庫中提供的數(shù)據(jù)結(jié)構(gòu)之外。在其初始版本中雇初,它提供雙端隊列(Deque)戏罢,有序集合(OrderedSet)和有序字典(OrderedDictionary)。

什么是雙端隊列(Deque)辅斟?

雙端隊列(Deque)的工作原理類似于Array:它是一個有序转晰,隨機(jī)訪問,可變的,范圍可替換的查邢,具有整數(shù)索引的集合蔗崎。

雙端隊列(Deque)比數(shù)組(Array)更有優(yōu)勢的是它支持支持兩端的有效插入和移除。

理解什么是隊列扰藕?

隊列是只允許在一端進(jìn)行插入操作缓苛、而在另一端進(jìn)行刪除操作的線性表。允許插入的一端稱為隊尾邓深,允許刪除的一端稱為隊頭未桥。隊列可以提供先進(jìn)先出的順序(FIFO)。

導(dǎo)入頭文件
import Collections
雙端隊列的基本使用
var numbers: Deque = ["2", "3", "4"]
//在頭部添加元素
numbers.prepend("1")
//在尾部添加元素
numbers.append("6")
//在特定位置插入元素
numbers.insert("5", at: 4)
// `numbers` is now ["1", "2", "3", "4", "5", "6"]
//刪除元素
print(numbers.popFirst()!)// 1 移除"1"
print(numbers.popLast()!)// 5 移除"5"
print(numbers)// [2, 3, 4, 5]
//獲取元素
print(numbers[0])// 2
//修改元素
numbers[1]="1"
print(numbers)// [2, 1, 4, 5]
//排序
numbers.sort()
print(numbers)// [1, 2, 4, 5]
//移除元素
numbers.remove(at: 0)
numbers.removeFirst(1)
numbers.removeLast()
numbers.removeAll()
移除符合條件的元素
var deque = Deque([1, 2, 3, 4, 5, 6])
deque.removeAll { (element) -> Bool in
    if element % 2 == 0 {
        return true
    }
    return false
}
print(deque)//[1, 3, 5]

什么是有序集合(OrderedSet)芥备?

有序集合(OrderedSet)是一個數(shù)組(Array)和一個集合(Set)的混合體冬耿。這意味著OrderedSet可以像傳統(tǒng)集合(Set)一樣有效地檢查元素是否在集合內(nèi),并且還可以像數(shù)組(Array)一樣在特定位置檢索元素萌壳。

導(dǎo)入頭文件
import Collections
有序集合的基本使用
var orderedSet = OrderedSet(["case0","case1","case2"])
//var orderedSet : OrderedSet = ["case1", "case2"]
//遍歷元素       
orderedSet.forEach { (element) in
      print(element)
 }
//添加元素
orderedSet.append("case3")
orderedSet.append(contentsOf: ["case4","case5","case6"])
 //["case0","case1","case2","case3","case4","case5","case6"]
//獲取元素
 orderedSet[0]
 //移除元素
orderedSet.remove(at: 0)
orderedSet.remove("case2")
orderedSet.removeFirst()
orderedSet.removeFirst(1)
orderedSet.removeLast()
orderedSet.removeLast(1)
orderedSet.removeAll()

// 移除符合條件的元素
var intOrderedSet = [1,2,3,4,5,6,7,8]
intOrderedSet.removeAll { (elment) -> Bool in
      if elment % 2 == 0 {
        return true
      }
        return false
}
//[1, 3, 5, 7]
Uion

取兩個集合(Set)的并集

let orderedSet = OrderedSet(["1", "2", "4"])
let newOrderedSet = orderedSet.union([
    "2", "3", "1"
])
print(newOrderedSet)//[1, 2, 4, 3]
Intersection

取兩個集合(Set)的交集

let orderedSet = OrderedSet([
    "0", "1", "2", "3", "4"
])
let newOrderedSet = orderedSet.intersection([
    "3", "2", "0"
])
print(newOrderedSet)//[0, 2, 3]
刪除重復(fù)數(shù)據(jù)

OrderedSet可以在保留原始元素順序的同時對有序元素進(jìn)行重復(fù)數(shù)據(jù)刪除

let timeSeries = [
    ["id": "0", "value": "0"],
    ["id": "1", "value": "1"],
    ["id": "0", "value": "0"],
    ["id": "2", "value": "2"],
    ["id": "1", "value": "1"]
]
let orderedUniqueSeries = OrderedSet(timeSeries)
print(orderedUniqueSeries)
//["id": "0", "value": "0"],
//["id": "1", "value": "1"],
//["id": "2", "value": "2"]

什么是有序字典(OrderedDictionary)亦镶?

當(dāng)元素的順序很重要或我們需要能夠有效訪問集合中各個位置的元素時,字典(OrderedDictionary)是字典(Dictionary)的有效的替代方法袱瓮。

導(dǎo)入頭文件
import Collections
有序字典的基本使用
var orderedDict: OrderedDictionary = [
    "key0": 0,
    "key1": 1
]
//插入鍵值對
orderedDict["key3"] = 3
orderedDict["key2"] = 2
orderedDict["key4"] = 4
orderedDict["key5"] = 5
print(orderedDict)//[key0: 0, key1: 1, key3: 3, key2: 2, key4: 4, key5: 5]
//獲取key對應(yīng)的value
print(orderedDict["key1"]!) // 1
//此外缤骨,OrderedDictionary它具有內(nèi)部順序,并且可以使用elements屬性來檢索順序中特定位置的值:
let element = orderedDict.elements[0]
print(element.key) // "key0"
print(element.value) // 0
//刪除鍵值對
orderedDict.removeValue(forKey: "key1")
orderedDict.remove(at: 0)
orderedDict.removeFirst()
orderedDict.removeFirst(1)
orderedDict.removeLast()
orderedDict.removeFirst(1)
orderedDict.removeAll()
移除符合條件的元素
var orderedDict: OrderedDictionary = [
    "key0": 0,
    "key1": 1
]
// Filter keys and values
orderedDict.removeAll { (key, value) -> Bool in
    if key == "key0" {
        return true
    }
    return false
}
print(orderedDict)//[key1: 1]
計數(shù)器

計數(shù)器通常用于確定序列中唯一元素出現(xiàn)的次數(shù)尺借。有序計數(shù)器允許對唯一元素的出現(xiàn)進(jìn)行計數(shù)绊起,同時還保留了先見順序:

let sequence = [
    "a", "b", "a", "c", "b", "b", "b", "a"
]

var orderedCounter: OrderedDictionary<String,Int> = [:]

for item in sequence {
    orderedCounter[item, default: 0] += 1
}

print(orderedCounter)//[a: 3, b: 4, c: 1]
print(orderedCounter["b"]!)// 4

let element = orderedCounter.elements[0]
print(element.key)// "a"
print(element.value)// 3
隨機(jī)訪問唯一的有序元素

當(dāng)使用唯一序列時,按順序訪問唯一序列的元素并使用唯一標(biāo)識符通常很有用燎斩。OrderedDictionary提供可以同時執(zhí)行以下操作的類型:

let timeSeries = [
    ["id": "t0", "value": "0.1"],
    ["id": "t1", "value": "1.1"],
    ["id": "t2", "value": "2.1"]
]

var series: OrderedDictionary<String, Dictionary<String,String>> = [:]

for datapoint in timeSeries {
    series[datapoint["id"]!] = datapoint
}

print(series)
//[t0: ["value": "0.1", "id": "t0"], t1: ["value": "1.1", "id": "t1"], t2: ["value": "2.1", "id": "t2"]]

print(series["t1"]!)// ["id": "t1", "value": "1.1"]
 
let element = series.elements[2]
print(element.key)// "t2"
print(element.value)// ["id": "t2", "value": "2.1"]

項目通過SwiftPM(Swift Package Manager)引入Swift Collections Package

新建一個Swift項目勒庄,Xcode Menu -> File -> Swift Packages -> Add Package Dependency...操作后如下圖

在搜索框??中輸入需要的依賴庫的Github地址,本文使用的是Swift Collections的依賴庫,Github地址:https://github.com/apple/swift-collections

點擊Next進(jìn)入下一步顯示如下圖


Up to Next Major: 當(dāng)前指定的版本號到下一個大版本號之間的最新版本瘫里,例如 2.0.0 ~ 3.0.0(不包含 3.0.0)
Up to Next Minor: 當(dāng)前指定的版本號到下一個次版本號之間的最新版本实蔽,例如 2.0.0 ~ 2.1.0(不包含 2.1.0)
Range: 指定的兩個版本號之間的最新版本,例如 2.1.0 ~ 2.7.2(不包含 2.7.2)
Exact: 指定使用某一具體的版本號

點擊Next進(jìn)入下一步顯示如下圖


同時谨读,我們也可以指定要依賴當(dāng)前 Package git 倉庫的某一個分支或者某一次 commit局装。

最后,勾選當(dāng)前 Package 要添加到工程中的哪些 Targets劳殖,即可铐尚。

全選,然后點擊Finish



在ViewController中導(dǎo)入就可以使用了


總結(jié)

@EyreFree:Swift Collections專注于擴(kuò)展可用的 Swift 數(shù)據(jù)結(jié)構(gòu)集哆姻。我們都知道目前 Swift 標(biāo)準(zhǔn)庫實現(xiàn)了三種最基本的通用數(shù)據(jù)結(jié)構(gòu):數(shù)組宣增、集合和字典,但很多時候為了更高效地解決問題矛缨,開發(fā)者們往往需要借助一些其他的數(shù)據(jù)結(jié)構(gòu)〉ⅲ現(xiàn)在官方已經(jīng)注意到了這一點帖旨,通過提供 Collections 庫來讓開發(fā)者們能夠花費盡可能少的精力來編寫更快、更可靠的程序灵妨,它的初始版本包含了三種最常見的數(shù)據(jù)結(jié)構(gòu):雙端隊列 Deque解阅、有序集合 OrderedSet 和有序字典 OrderedDictionary。

參考文獻(xiàn)
[1]Introducing Swift Collections : https://swift.org/blog/swift-collections
[2]Swift Collections Github : https://github.com/apple/swift-collections
[3]在 Xcode 中使用 Swift Package : https://xiaozhuanlan.com/topic/9635421780
[4]Rob Blog : https://www.advancedswift.com/author/rob/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末泌霍,一起剝皮案震驚了整個濱河市货抄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌朱转,老刑警劉巖蟹地,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異藤为,居然都是意外死亡怪与,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門凉蜂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來琼梆,“玉大人性誉,你說我怎么就攤上這事窿吩。” “怎么了错览?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵纫雁,是天一觀的道長。 經(jīng)常有香客問我倾哺,道長轧邪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任羞海,我火速辦了婚禮忌愚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘却邓。我一直安慰自己硕糊,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布腊徙。 她就那樣靜靜地躺著简十,像睡著了一般。 火紅的嫁衣襯著肌膚如雪撬腾。 梳的紋絲不亂的頭發(fā)上螟蝙,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機(jī)與錄音民傻,去河邊找鬼胰默。 笑死场斑,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的初坠。 我是一名探鬼主播和簸,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼碟刺!你這毒婦竟也來了锁保?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤半沽,失蹤者是張志新(化名)和其女友劉穎爽柒,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體者填,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡浩村,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了占哟。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片心墅。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖榨乎,靈堂內(nèi)的尸體忽然破棺而出怎燥,到底是詐尸還是另有隱情,我是刑警寧澤蜜暑,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布铐姚,位于F島的核電站,受9級特大地震影響肛捍,放射性物質(zhì)發(fā)生泄漏隐绵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一拙毫、第九天 我趴在偏房一處隱蔽的房頂上張望依许。 院中可真熱鬧,春花似錦缀蹄、人聲如沸峭跳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坦康。三九已至,卻和暖如春诡延,著一層夾襖步出監(jiān)牢的瞬間滞欠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工肆良, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留筛璧,地道東北人逸绎。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像夭谤,于是被迫代替她去往敵國和親棺牧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

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

  • 夜鶯2517閱讀 127,720評論 1 9
  • 版本:ios 1.2.1 亮點: 1.app角標(biāo)可以實時更新天氣溫度或選擇空氣質(zhì)量朗儒,建議處女座就不要選了颊乘,不然老想...
    我就是沉沉閱讀 6,896評論 1 6
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月,有人笑有人哭醉锄,有人歡樂有人憂愁乏悄,有人驚喜有人失落,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,536評論 28 53
  • 兔子雖然是枚小碩 但學(xué)校的碩士四人寢不夠 就被分到了博士樓里 兩人一間 在學(xué)校的最西邊 靠山 兔子的室友身體不好 ...
    待業(yè)的兔子閱讀 2,603評論 2 9