2011-01-14 46 views
19

是否有NSDictionary返回密鑰的原因是NSArray而不是NSSet?該文檔已經指出,數組中的鍵的順序是未定義的,使用一個集合聽起來合乎邏輯。爲什麼不[NSDictionary allKeys]返回一個集合?

+4

有趣的問題。不得不懷疑,這是純粹是因爲NSSet在NeXTSTEP以前的日子裏,NSArray就在那裏,但這完全是我的猜測。 – 2011-01-14 17:56:28

+0

不錯的問題,我也會假設它,因爲NSArray是第一個,是比一套更廣泛使用/理解/已知的結構。我不記得,但也許當你返回鍵數組時,它會對它們進行排序,提供一種更簡單的迭代方法? – 2011-01-14 18:00:32

+0

[File an enhancement request。](http://bugreporter.apple.com/) – 2011-01-14 18:26:41

回答

2

集合在API設計中往往被忽略。它們大部分時間都會包含在內,但通常會在所有其他標準數據結構之後。除此之外,除了最近的NSFastEnumeration之外,Objective-C中沒有通用的集合或順序協議 - 每個集合類都完全獨立於其他所有集合類,並且很難在API之後切換到集合已經寫成返回數組。

1

猜測是蘋果採用NSArray所有的地方(以及大多數程序員也一樣),所以這個選擇順其自然 - 現在改變它將付出了高昂的代價。而如果在內部使用數組,一個不可變數組的副本比爲了數學優雅而創建一個集合要便宜得多。

還要注意的是NSSetNSArray沒有一個共同的父(當然,除了NSObject,當然),所以這個抽象接口也是不可能的(除了返回一些符合NSFastEnumeration)。

只是瘋狂的猜測,當然。 ;-)

0

我的猜測是,由於-allKeys返回副本鑰匙(它不是由字典支持),創建一個NSSet是一個很大的開銷(構建樹或哈希表或其他)時相比之下,只是將按鍵傾倒成平面陣列。

-3

使用使用C++,std :: map提供對其鍵的訪問權限作爲集合。返回的集合甚至是「現場」,該集合反映了當前正在進行的一組鍵。當然你也可以自由複製。

0

通常你會想要做的東西按鍵,在這種情況下,它更容易使用這種方法的NSDictionary:

- (NSSet<KeyType> *)keysOfEntriesPassingTest:(BOOL (^)(KeyType key, ObjectType obj, BOOL *stop))predicate NS_AVAILABLE(10_6, 4_0); 

這樣可以節省時間,因爲現在你不需要使用過濾您的陣列謂詞,你可以在這裏執行你的測試,然後你回來。簡單。

此外,你可以通過併發枚舉選項,這個版本的方法,充分利用多處理器的併發:

- (NSSet<KeyType> *)keysOfEntriesWithOptions:(NSEnumerationOptions)opts passingTest:(BOOL (^)(KeyType key, ObjectType obj, BOOL *stop))predicate NS_AVAILABLE(10_6, 4_0); 
相關問題