Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
oddified C3P4
  • Loading branch information
LKIN committed Sep 28, 2019
1 parent 4892353 commit dbfbc72
Showing 1 changed file with 10 additions and 19 deletions.
29 changes: 10 additions & 19 deletions 第三章:集合类型协议/3.5专门的集合类型.md
Expand Up @@ -21,19 +21,16 @@


#### BidirectionalCollection:
```sufix``````removeLast``````reversed``` 就是由它来提供。是不是很熟悉

它提供了```sufix()``````removeLast()``````reversed()``` 几个我们看起来很眼熟的函数很熟悉

#### RandomAccessCollection
和BidirectionalCollection ```index(_:offsetBy:)```` 去通过渐进的方式去遍历, 相比 RandomAccessCollection 可以 ```直接在两个索引之间``来移动。
例如计算 startIndex 和 endIndex 的间距。 RandomAccessCollection可以在```常数时间内```计算出count 而其他就会慢很多。
例如计算 startIndex 和 endIndex 的间距。 RandomAccessCollection可以在```常数时间内```计算出count,相对高效,而其他就会慢很多。

#### MutableCollection
支持原地的元素更改。
只能改变集合的元素值,无法改变``集合的长度````元素的顺序``
MutableCollection 只多了一个required func:
```subscript``` 而且要必须提供一个 ```setter```

它支持原地的元素更改。
一般的集合只能改变集合的元素值,无法改变``集合的长度````元素的顺序``
MutableCollection 只多了一个必须要实现的方法```subscript``` ,而且必须要实现其内部的set方法
///协议方法
public subscript(position: Self.Index) -> Self.Element { get set }

Expand All @@ -49,27 +46,21 @@ MutableCollection 只多了一个required func:
}


注:编译器不会让我们向一个已经存在的Collection通过扩展```添加下标的setter方法``` 原因有二:
1.要提供setter就要提供getter
2.无法重新定义已存在的getter方法
所以我们只能重新写一个协议去替换collection 所以要重新去写getter setter方法。

知识点1:Array Dict Set 中只有```Array```满足这个协议。
~~注:编译器不会让我们向一个已经存在的Collection通过扩展```添加下标的setter方法``` 原因有二:~~
~~1.要提供setter就要提供getter~~
~~2.无法重新定义已存在的getter方法~~
~~所以我们只能重新写一个协议去替换collection 所以要重新去写getter setter方法。~~

##### 知识点1:集合类型 Array Dict Set 中只有```Array```满足这个协议。

#### RangeReplaceableCollection
需要添加或者移除元素可以用这个协议
有两个要求:
1.一个```空的初始化方法```(在泛型函数中很好用,因为泛型允许一个函数创建相同类型的 新的空集合)
2.```replaceSubrange(_:with:)```方法 参数为范围和要替换的集合。


#### 组合能力
我们可以将上面这些特殊的集合协议``组合起来```,来达到我们想要的效果。


# 本章回顾
集合类型主要是由 ```Sequence``````Collection``` 协议构成了

###### TODO 内容知识点后期可以更生动形象的写出来

0 comments on commit dbfbc72

Please sign in to comment.