集合類型協(xié)議
3.5專門的集合類型:Special Collection
對(duì)于collection來(lái)說(shuō),有兩個(gè)有意思的限制
1.無(wú)法將索引后退移動(dòng)。
2.沒有提供插入,移動(dòng),替換元素的功能。
雖然只是有一部分集合可以使用他們,但作為標(biāo)準(zhǔn)庫(kù)。就只寫一些通用的方法。
在標(biāo)準(zhǔn)庫(kù)中有四個(gè)針對(duì)于collection 補(bǔ)充的協(xié)議
//一個(gè)既可以前向又可以后向遍歷的集合
BidirectionalCollection
//一個(gè)可以高效隨機(jī)存取索引遍歷的集合
RandomAccessCollection
//一個(gè)可以下標(biāo)賦值的集合
MutableCollection
//一個(gè)可以將任意子范圍的元素用別的集合中的元素進(jìn)行替換的集合
RangeReplaceableCollection
BidirectionalCollection:
sufix, removeLast 和 reversed 就是由它來(lái)提供。是不是很熟悉
RandomAccessCollection
和BidirectionalCollection index(_:offsetBy:)```` 去通過漸進(jìn)的方式去遍歷, 相比 RandomAccessCollection 可以直接在兩個(gè)索引之間``來(lái)移動(dòng)。
例如計(jì)算 startIndex 和 endIndex 的間距。 RandomAccessCollection可以在常數(shù)時(shí)間內(nèi)計(jì)算出count 而其他就會(huì)慢很多。
MutableCollection
支持原地的元素更改。
只能改變集合的元素值,無(wú)法改變集合的長(zhǎng)度或元素的順序。
MutableCollection 只多了一個(gè)required func:
subscript 而且要必須提供一個(gè) setter
///協(xié)議方法
public subscript(position: Self.Index) -> Self.Element { get set }
public subscript(position: Element) -> Element {
get {
return Element
}
set {
//必須要提供
}
}
注:編譯器不會(huì)讓我們向一個(gè)已經(jīng)存在的Collection通過擴(kuò)展添加下標(biāo)的setter方法 原因有二:
1.要提供setter就要提供getter
2.無(wú)法重新定義已存在的getter方法
所以我們只能重新寫一個(gè)協(xié)議去替換collection 所以要重新去寫getter setter方法。
知識(shí)點(diǎn)1:Array Dict Set 中只有Array滿足這個(gè)協(xié)議。
RangeReplaceableCollection
需要添加或者移除元素可以用這個(gè)協(xié)議
有兩個(gè)要求:
1.一個(gè)空的初始化方法(在泛型函數(shù)中很好用,因?yàn)榉盒驮试S一個(gè)函數(shù)創(chuàng)建相同類型的 新的空集合)
2.replaceSubrange(_:with:)方法 參數(shù)為范圍和要替換的集合。
組合能力
我們可以將上面這些特殊的集合協(xié)議``組合起來(lái)```,來(lái)達(dá)到我們想要的效果。
本章回顧
集合類型主要是由 Sequence 和 Collection 協(xié)議構(gòu)成了