20

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

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

为什么这些不同?

4

3 回答 3

18

推测,但是:

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

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

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

于 2012-11-20T07:42:21.583 回答
5

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


.array返回底层的实时代理NSOrderedSet,如果底层有序集发生变化,代理将随之变化。

于 2015-03-03T21:08:59.887 回答
1

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

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

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

于 2014-11-11T19:08:37.347 回答