Swift 字典为什么不采用MutableCollectionType协议?

Swift 字典为什么不采用MutableCollectionType协议?,swift,dictionary,Swift,Dictionary,在实现自定义集合类型(从而使其遵守CollectionType协议)时,我开始想知道为什么Dictionary类型不采用MutableCollectionType 从MutableCollectionType的文档中: 支持下标赋值的集合 对于符合MutableCollectionType的类型的任何实例: a[i] = x let y = a[i] 相当于: a[i] = x 设y=x 因此,字典也采用这个协议似乎是“合乎逻辑的”。但是,在签出头文件和文档之后,似乎只有Array和相关类型

在实现自定义集合类型(从而使其遵守
CollectionType
协议)时,我开始想知道为什么
Dictionary
类型不采用
MutableCollectionType

MutableCollectionType
的文档中:

支持下标赋值的集合

对于符合MutableCollectionType的类型的任何实例:

a[i] = x
let y = a[i]
相当于:

a[i] = x
设y=x

因此,字典也采用这个协议似乎是“合乎逻辑的”。但是,在签出头文件和文档之后,似乎只有
Array
和相关类型才能这样做

关于
MutableCollectionType
,或者关于
Dictionary
,或者两者都有什么特别之处?我的字典式自定义集合类型是否也应该出于某种原因避免采用
MutableCollectionType

尽管任意序列在遍历时可能会被消耗,但集合是多过程的:任何元素都可以通过保存其索引来重新访问


这对字典来说毫无意义,因为字典是无序的。仅仅因为由“howdy”键控的条目现在位于索引2,并不意味着它将在一分钟后位于索引2。特别是,说“在索引2处插入此键”是没有意义的——提供顺序的是键和内部哈希。索引本身没有持久生命。因此,它是一个集合(它有索引),但不是一个可变的集合(不能通过索引写入)。

浏览一下将其描述为具有类似于
排序
分区
的方法。它还有一个内部类型调用
子序列
。这些对字典来说毫无意义。字典中没有顺序。

要理解
MutableCollectionType
协议的声明,首先需要知道一个称为下标的概念

当您编写“
let y=dic[key]
”时,Swift正在调用一个名为subscript getter的方法:

subscript (key: Key) -> Value? { get }
当您编写“
dic[key]=x
”时,Swift正在调用一个名为下标设置器的方法:

subscript (key: Key) -> Value? { set }
现在让我们看看
MutableCollectionType
协议<代码>字典不符合
MutableCollectionType
。因为该协议所需的方法未在
字典中实现

所需的方法之一是

public subscript (position: Self.Index) -> Self.Generator.Element { get set }
这种下标方法与我们每天使用的上述两种方法不同。
position
的类型是
Self.Index
,它是
Dictionary
类型的
DictionaryIndex
。返回类型
Self.Generator.Element
(键,值)
。我认为这个索引类型
DictionaryIndex
与哈希表实现有关,它可以用来直接引用哈希表元素。当您使用下标的setter时,您将编写如下内容

dic[index] = (key, value)

用另一个键值对替换散列映射元素肯定没有意义。此下标设置程序从未由
字典实现,因此它不符合
可变集合类型
协议。

您提供的摘录来自
字典采用的
集合类型
的描述。我的问题是关于
MutableCollectionType
。没错,但想想我说的其他问题。docs的报价只是热身而已。谢谢。我想我现在开始明白了。细微的区别在于
索引
,这与
字典
不同。可变性意味着能够更改
索引
处的值,但
字典
不允许这样做。它只允许在给定的
上进行更改。我知道
字典
不采用
MutableCollectionType
协议。我的问题正是关于这一点。“那就是,为什么它不这样做呢?”安东布朗尼科夫:我没有清楚地描述它吗?它不采用该协议,因为没有实现该协议所需的方法。