[swift 進階]讀書筆記-集合型別協議 C3P5_專門的集合型別

liaoWorking在掘金發表於2018-12-22

集合型別協議

3.5專門的集合型別:Special Collection

對於collection來說,有兩個有意思的限制 1.無法將索引後退移動。 2.沒有提供插入,移動,替換元素的功能。 雖然只是有一部分集合可以使用他們,但作為標準庫。就只寫一些通用的方法。

在標準庫中有四個針對於collection 補充的協議

    //一個既可以前向又可以後向遍歷的集合
    BidirectionalCollection
    //一個可以高效隨機存取索引遍歷的集合
    RandomAccessCollection
    //一個可以下標賦值的集合
    MutableCollection
    //一個可以將任意子範圍的元素用別的集合中的元素進行替換的集合
    RangeReplaceableCollection
複製程式碼

BidirectionalCollection:

sufixremoveLastreversed 就是由它來提供。是不是很熟悉

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:)方法 引數為範圍和要替換的集合。

組合能力

我們可以將上面這些特殊的集合協議``組合起來```,來達到我們想要的效果。

本章回顧

集合型別主要是由 SequenceCollection 協議構成了

TODO 內容知識點後期可以更生動形象的寫出來

文章原始檔地址

相關文章