为什么不[NSDictionary allKeys]返回一组?

时间:2011-01-14 17:53:37

标签: cocoa nsdictionary

NSDictionary是否有理由将其密钥作为NSArray而不是NSSet返回?文档已经说明数组中键的顺序是未定义的,使用集合听起来合乎逻辑。

5 个答案:

答案 0 :(得分:2)

在API设计中,集合往往有些被忽略。它们大部分时间都会包含在内,但通常在所有其他标准数据结构之后很久。除此之外,除了最近的NSFastEnumeration之外,Objective-C中没有通用的集合或序列协议 - 每个集合类完全独立于所有其他集合 - 并且在API之后切换到集合变得非常困难已经编写了返回数组。

答案 1 :(得分:1)

我的猜测是Apple在整个地方使用NSArray(以及大多数程序员),所以这种选择自然而然 - 现在改变它会花费很高的代价。并且如果在内部使用数组,不可变数组的副本比为了数学优雅而构建集合要便宜得多。

另请注意,NSSetNSArray没有共同的父级(当然,除了NSObject之外),因此抽象此界面也是不可能的(除了返回某些内容)符合NSFastEnumeration)。

当然,只是疯狂的猜测。 ; - )

答案 2 :(得分:0)

我的猜测是,由于-allKeys返回密钥的副本(它没有字典支持),因此创建NSSet会产生大量开销(构建)比较只是将密钥转储到平面数组中的树或哈希表或其他任何东西。

答案 3 :(得分: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);

答案 4 :(得分:-3)

使用use c ++,std :: map提供对其键的访问权限。返回的集合甚至是“实时”,该集合反映了当前正在进行的密钥集。当然你也可以自由复制。