为什么Dictionary不采用MutableCollectionType协议?

时间:2015-10-04 14:43:45

标签: swift dictionary

在实施自定义集合类型(并因此使其符合CollectionType协议)时,我开始想知道为什么MutableCollectionType类型未采用Dictionary

来自MutableCollectionType的文档:

  

支持下标分配的集合。

     

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

a[i] = x
let y = a[i]
     

相当于:

a[i] = x
     

让y = x

因此,它看起来似乎是合乎逻辑的"该词典也采用这个协议。但是,在检出头文件和文档之后,似乎只有Array和相关类型才会这样做。

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

3 个答案:

答案 0 :(得分:2)

浏览protocol reference时,我们会将其描述为sortpartition等方法。它还有一个内部类型调用SubSequence。这些对词典毫无意义。字典中没有顺序。

答案 1 :(得分:1)

来自标题:

  

在遍历时可能会消耗任意序列,而集合是多遍的:只需保存其索引即可重新访问任何元素。

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

答案 2 :(得分:-2)

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

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

subscript (key: Key) -> Value? { get }

当你写“dic[key] = x”时,Swift正在调用一个名为下标setter的方法:

subscript (key: Key) -> Value? { set }

现在让我们看看MutableCollectionType协议。 Dictionary不符合MutableCollectionType。因为Dictionary中未实现此协议所需的方法。

所需方法之一是

public subscript (position: Self.Index) -> Self.Generator.Element { get set }

这个下标方法与我们每天使用的上述两种方法不同。 position的类型为Self.IndexDictionaryIndex<Key, Value>类型为Dictionary。返回类型Self.Generator.Element(Key, Value)。我认为这个索引类型DictionaryIndex是与哈希表实现相关的东西,它可以用来直接引用哈希表元素。当您使用下标的setter时,您将编写类似

的内容
dic[index] = (key, value)

用另一个键值对替换哈希映射元素当然没有意义。此下标setter永远不会由Dictionary实现,因此它不符合MutableCollectionType协议。