集合類型協(xié)議
3.5專門的集合類型:Special Collection
對(duì)于collection來(lái)說(shuō),有兩個(gè)有意思的限制
1.無(wú)法將索引后退移動(dòng)捆蜀。
2.沒(méi)有提供插入攻臀,移動(dòng),替換元素的功能盗扒。
雖然只是有一部分集合可以使用他們跪楞,但作為標(biāo)準(zhǔn)庫(kù)。就只寫(xiě)一些通用的方法侣灶。
在標(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:)```` 去通過(guò)漸進(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通過(guò)擴(kuò)展添加下標(biāo)的setter方法
原因有二:
1.要提供setter就要提供getter
2.無(wú)法重新定義已存在的getter方法
所以我們只能重新寫(xiě)一個(gè)協(xié)議去替換collection 所以要重新去寫(xiě)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)成了