在实现自定义集合类型(并因此使其遵守CollectionType协议)时,我开始想知道为什么Dictionary类型不采用MutableCollectionType?
来自MutableCollectionType的文档
支持下标分配的集合。 对于任何符合MutableCollectionType的类型的a,: ai =x让y= ai 相当于: ai =x 设y=x
因此,字典也采用这一协议似乎是“合乎逻辑的”。但是,在签出头文件和文档之后,似乎只有Array和相关类型才能做到这一点。
MutableCollectionType有什么特别之处,或者Dictionary有什么特别之处?我的字典类自定义集合类型是否也应该出于某种原因避免采用MutableCollectionType?
发布于 2015-10-04 14:52:21
在标题中:
虽然任意序列在遍历时可能会被消耗,但是集合是多次传递的:任何元素都可以通过保存其索引来重新访问。
这对字典来说是没有意义的,因为字典是无序的。仅仅因为"howdy“键现在在索引2上,并不意味着从现在开始它就会在索引2上。特别是,说“在索引2处插入这个键”是没有意义的--提供顺序的是键和内部散列。这些索引本身没有持久的生命。因此,它是一个集合(它有索引),但不是一个可变的集合(不能按索引写入)。
发布于 2015-10-04 14:55:12
浏览一下协议参考,就会发现它拥有sort和partition这样的方法。它还有一个内部类型的调用SubSequence。这些对字典来说是毫无意义的。字典里没有顺序。
发布于 2015-10-04 16:11:03
要理解MutableCollectionType协议的声明,首先需要知道一个名为下标的概念。
当您编写“let y = dic[key]”时,Swift调用一个名为下标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.Index,它是Dictionary类型的DictionaryIndex<Key, Value>。返回类型Self.Generator.Element是(Key, Value)。我认为这个索引类型DictionaryIndex与哈希表实现有关,它可以直接引用哈希表元素。当您使用下标的setter时,您将编写以下内容
dic[index] = (key, value)用另一个键值对替换散列映射元素当然是没有意义的。这个下标设置程序从未由Dictionary实现,因此它不符合MutableCollectionType协议。
https://stackoverflow.com/questions/32934699
复制相似问题