set中的数组:为什么NSSet使用allObjects,而NSOrderedSet使用数组?

时间:2012-11-20 07:22:25

标签: objective-c nsorderedset

在Foundation中,如果我想将一个集转换为NSArray,我可以使用:

  • -[NSSet allObjects]
  • -[NSOrderedSet array]

为什么这些不同?

3 个答案:

答案 0 :(得分:16)

猜测,但是:

因为在创建NSSet时,唯一的其他主要集合类型是NSArray,它是(并且仍然是)最常见的集合类型。因此,一个名为“allObjects”的方法显然会返回一个NSArray。

当最近添加NSOrderedSet时,它必须处理先前集合的存在 - 主要是NSArray和NSSet。因此,“allObjects”方法将是模糊的。它有两种方法,-array和-set。

和/或,-array和-set方法将代理返回到内部使用的相同或类似类的代理。因此在功能意义上它们有点不同 - 这些代理将看到在原始NSOrderedSet上进行的突变。另一方面-allObjects没有 - 它真正创建了一个独立的数组,因为它的内部存储可能是一个哈希表或类似的,不容易代理。

答案 1 :(得分:4)

虽然存在其他差异†,.allObjects并不意味着明确的排序,而.array确实如此;这正是你得到的。


.array会返回基础NSOrderedSet的实时代理,如果基础有序集发生更改,则代理会随之更改。

答案 2 :(得分:1)

此外...'allObjects'返回的NSArray是集合中值的副本。

但'array'返回的NSArray是集合中对象的代理。

因此,如果更改集合中任何对象的值,则将更改数组中对象的值。没有订购套装的副本。所以这两个属性有不同的名称,因为它们做了不同的事情。