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

use*_*951 16 objective-c nsorderedset

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

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

为什么这些不同?

Wad*_*kis 17

猜测,但:

因为当创建NSSet时,唯一的其他主要集合类型是NSArray,它是(并且仍然是)最常见的集合类型.所以一个名为"allObjects"的方法显然会返回一个NSArray.

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

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


Cla*_*ges 5

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


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