是否有NSDictionary
返回密鑰的原因是NSArray
而不是NSSet
?該文檔已經指出,數組中的鍵的順序是未定義的,使用一個集合聽起來合乎邏輯。爲什麼不[NSDictionary allKeys]返回一個集合?
19
A
回答
2
集合在API設計中往往被忽略。它們大部分時間都會包含在內,但通常會在所有其他標準數據結構之後。除此之外,除了最近的NSFastEnumeration之外,Objective-C中沒有通用的集合或順序協議 - 每個集合類都完全獨立於其他所有集合類,並且很難在API之後切換到集合已經寫成返回數組。
1
我猜測是蘋果採用NSArray
所有的地方(以及大多數程序員也一樣),所以這個選擇順其自然 - 現在改變它將付出了高昂的代價。而如果在內部使用數組,一個不可變數組的副本比爲了數學優雅而創建一個集合要便宜得多。
還要注意的是NSSet
和NSArray
沒有一個共同的父(當然,除了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);
相關問題
- 1. 爲什麼NSDictionary的allKeys和allValues方法返回NSArray而不是NSSet?
- 2. NSDictionary allkeys到UITableViewCell
- 3. NSDictionary allKeys order
- 4. 的NSDictionary allKeys返回NSArray的,而不是NSSet中
- 5. 爲什麼查詢返回空集合?
- 6. 爲什麼sameElements對集合返回true?
- 7. 爲什麼Python的dict.keys()返回一個列表而不是一個集合?
- 8. 爲什麼{{site.eggs.label}}不會爲jekyll集合「雞蛋」返回「雞蛋」?
- 9. 爲什麼不收集骨幹取返回一個承諾
- 10. NSDictionary命令不匹配allKeys命令
- 11. 爲什麼不能將一個集合作爲一個集合的元素?
- 12. 什麼時候返回空集合,什麼時候不是?
- 13. 爲什麼聚合集只返回100個結果?
- 14. 什麼是NSDictionary的-allKeys方法的計算複雜性?
- 15. Objective-C方法返回NSDictionary而不是NSMutableDictionary。爲什麼?
- 16. 什麼在使用地圖時返回一個集合
- 17. 爲什麼getDatabaseNames()返回一個List並且getCollectionNames()在mongo DB中返回一個集合
- 18. 爲什麼這個存儲過程返回一個空集?
- 19. 爲什麼這個xpath返回一個空的節點集?
- 20. 爲什麼List.AsReadOnly返回一個ReadOnlyCollection,但Dictionary.AsReadOnly返回一個IReadOnlyDictionary?
- 21. NSDictionary,爲什麼是這個
- 22. 返回集合
- 23. 爲什麼Clipboard.GetFileDropList()在遠程桌面上返回一個空集合?
- 24. 爲什麼使用.Invoke()調用Powershell腳本塊會返回一個集合?
- 25. 爲什麼line()不總是返回一個線對象?爲什麼它有時似乎返回一個雙?
- 26. 爲什麼我不得不爲None返回一個類型值?
- 27. 爲什麼我得到「[__NSArrayI allKeys]:無法識別的選擇器發送到實例」/爲什麼NSDictionary轉換?
- 28. 爲什麼它返回一個錯誤?
- 29. 爲什麼XmlDictionary.Add()返回一個XmlDictionaryString?
- 30. 爲什麼jQuery hasClass返回一個TypeError?
有趣的問題。不得不懷疑,這是純粹是因爲NSSet在NeXTSTEP以前的日子裏,NSArray就在那裏,但這完全是我的猜測。 – 2011-01-14 17:56:28
不錯的問題,我也會假設它,因爲NSArray是第一個,是比一套更廣泛使用/理解/已知的結構。我不記得,但也許當你返回鍵數組時,它會對它們進行排序,提供一種更簡單的迭代方法? – 2011-01-14 18:00:32
[File an enhancement request。](http://bugreporter.apple.com/) – 2011-01-14 18:26:41