2015-10-04 51 views
1

在执行自定义集合类型(并因此使其遵守CollectionType协议)时,我开始想知道为什么MutableCollectionType不被Dictionary类型所采用?为什么Dictionary没有采用MutableCollectionType协议?

从文档MutableCollectionType

支持下标分配的集合。

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

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

相当于:

a[i] = x 

设Y = X

因此,似乎“逻辑“,即Dictionary也采用这个协议。但是,在检出头文件和文档之后,似乎只有Array和相关类型可以完成此操作。

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

回答

1

从标头:

然而,因为它是遍历的任意序列可能被消耗掉,一个收集是多遍:任何元件可以仅通过保存它的索引被重新考虑。

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

+0

您提供的摘录来自'Dictionary'所采用的** CollectionType的描述。我的问题是关于'MutableCollectionType'。 – courteouselk

+0

确实如此,但想想别的我说的。文档报价只是热身。 – matt

+2

谢谢。我想我现在开始明白了。这个细微的差别在'key'和'index'中,'Dictionary'不一样。可变性意味着能够改变'index'的值,但'Dictionary'不允许这样做。它只允许在给定的'key'处进行修改。 – courteouselk

2

瞥一眼protocol reference将其描述为具有诸如sortpartition的方法。它也有一个内部类型电话SubSequence。这些对于字典来说是毫无意义的。字典中没有顺序。

-2

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

当你写“let y = dic[key]”,斯威夫特被调用的方法称为标吸气:

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

当你写“dic[key] = x”,斯威夫特被调用的方法称为标制定者:

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

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

一个所需的方法是

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

此标方法是不一样的上述两个我们每天都在使用。 position的类型为Self.Index,这是DictionaryIndex<Key, Value>Dictionary类型。并且返回类型Self.Generator.Element(Key, Value)。我认为这种索引类型DictionaryIndex是与哈希表实现相关的,它可以用来直接引用哈希表元素。当你使用下标的设置器时,你会写如

dic[index] = (key, value) 

用另一个键值对替换哈希映射元素当然没有意义。该下标设置器从不实现Dictionary,因此它不符合MutableCollectionType协议。

+0

我知道'Dictionary'不采用'MutableCollectionType'协议。我的问题恰恰就是这个。也就是说,为什么不这样做。 – courteouselk

+0

@AntonBronnikov我没有清楚地描述它吗?它不采用该协议,因为该协议所需的方法未实现。 – Cosyn