什么是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/