集合型別協議
3.5專門的集合型別:Special Collection
對於collection來說,有兩個有意思的限制 1.無法將索引後退移動。 2.沒有提供插入,移動,替換元素的功能。 雖然只是有一部分集合可以使用他們,但作為標準庫。就只寫一些通用的方法。
在標準庫中有四個針對於collection 補充的協議
//一個既可以前向又可以後向遍歷的集合
BidirectionalCollection
//一個可以高效隨機存取索引遍歷的集合
RandomAccessCollection
//一個可以下標賦值的集合
MutableCollection
//一個可以將任意子範圍的元素用別的集合中的元素進行替換的集合
RangeReplaceableCollection
複製程式碼
BidirectionalCollection:
sufix
, removeLast
和 reversed
就是由它來提供。是不是很熟悉
RandomAccessCollection
和BidirectionalCollection index(_:offsetBy:)```` 去通過漸進的方式去遍歷, 相比 RandomAccessCollection 可以
直接在兩個索引之間``來移動。
例如計算 startIndex 和 endIndex 的間距。 RandomAccessCollection可以在常數時間內
計算出count 而其他就會慢很多。
MutableCollection
支援原地的元素更改。
只能改變集合的元素值,無法改變集合的長度
或元素的順序
。
MutableCollection 只多了一個required func:
subscript
而且要必須提供一個 setter
///協議方法
public subscript(position: Self.Index) -> Self.Element { get set }
public subscript(position: Element) -> Element {
get {
return Element
}
set {
//必須要提供
}
}
複製程式碼
注:編譯器不會讓我們向一個已經存在的Collection通過擴充套件新增下標的setter方法
原因有二:
1.要提供setter就要提供getter
2.無法重新定義已存在的getter方法
所以我們只能重新寫一個協議去替換collection 所以要重新去寫getter setter方法。
知識點1:Array Dict Set 中只有Array
滿足這個協議。
RangeReplaceableCollection
需要新增或者移除元素可以用這個協議
有兩個要求:
1.一個空的初始化方法
(在泛型函式中很好用,因為泛型允許一個函式建立相同型別的 新的空集合)
2.replaceSubrange(_:with:)
方法 引數為範圍和要替換的集合。
組合能力
我們可以將上面這些特殊的集合協議``組合起來```,來達到我們想要的效果。
本章回顧
集合型別主要是由 Sequence
和 Collection
協議構成了