在实施自定义集合类型(并因此使其符合CollectionType
协议)时,我开始想知道为什么MutableCollectionType
类型未采用Dictionary
?
来自MutableCollectionType
的文档:
支持下标分配的集合。
对于符合MutableCollectionType的类型的任何实例a:
a[i] = x let y = a[i]
相当于:
a[i] = x
让y = x
因此,它看起来似乎是合乎逻辑的"该词典也采用这个协议。但是,在检出头文件和文档之后,似乎只有Array
和相关类型才会这样做。
关于MutableCollectionType
,或关于Dictionary
,或两者兼而有之,有什么特别之处?我的字典式自定义集合类型是否也应该避免因某种原因采用MutableCollectionType
?
答案 0 :(得分:2)
浏览protocol reference时,我们会将其描述为sort
和partition
等方法。它还有一个内部类型调用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.Index
,DictionaryIndex<Key, Value>
类型为Dictionary
。返回类型Self.Generator.Element
为(Key, Value)
。我认为这个索引类型DictionaryIndex
是与哈希表实现相关的东西,它可以用来直接引用哈希表元素。当您使用下标的setter时,您将编写类似
dic[index] = (key, value)
用另一个键值对替换哈希映射元素当然没有意义。此下标setter永远不会由Dictionary
实现,因此它不符合MutableCollectionType
协议。