在 Foundation 中,如果我想将一个集合转换为一个NSArray
,我可以使用:
-[NSSet allObjects]
-[NSOrderedSet array]
为什么这些不同?
在 Foundation 中,如果我想将一个集合转换为一个NSArray
,我可以使用:
-[NSSet allObjects]
-[NSOrderedSet array]
为什么这些不同?
推测,但是:
因为在创建 NSSet 时,唯一的其他主要集合类型是 NSArray,它是(并且仍然是,很大程度上)最常见的集合类型。因此,一个名为“allObjects”的方法显然会返回一个 NSArray。
当 NSOrderedSet 最近被添加时,它必须处理先前集合的存在——主要是 NSArray 和 NSSet。因此,“allObjects”方法将是模棱两可的。因此它有两种方法,-array 和 -set。
和/或,-array 和 -set 方法将代理返回到内部使用的可能相同或相似的类。所以在功能上它们有点不同——那些代理会看到原始 NSOrderedSet 上的突变。另一方面 -allObjects 不会 - 它真正创建了一个独立的数组,因为它的内部存储可能是一个不容易代理的哈希表或类似的。
虽然存在其他差异†,.allObjects
但并不意味着确定的顺序,.array
但确实如此;这正是你得到的。
†.array
返回底层的实时代理NSOrderedSet
,如果底层有序集发生变化,代理将随之变化。
另外... 'allObjects' 返回的 NSArray 是集合中值的副本。
但是 'array' 返回的 NSArray 是集合中对象的代理。
因此,如果您更改集合中任何对象的值,您将更改数组中对象的值。未制作订购集的副本。所以这两个属性有不同的名称,因为它们做不同的事情。