2015-10-04 53 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

相關問題