我可以使用NSMutableArray insertObjects:atIndexes以不同的顺序插入多个项目吗?

时间:2014-02-10 00:04:57

标签: ios objective-c nsmutablearray

我想使用NSMutableArray在单个操作中将一系列项目插入insertObjects:atIndexes,并同时对项目进行排序 - 但我无法弄清楚如何建立正确的NSIndexSet。像这样:

NSMutableArray* target = [[NSMutableArray alloc]initWithObjects:@0, @100, nil];
NSArray* itemsToInsert = @[@50, @10];

NSMutableIndexSet* indexes = [[NSMutableIndexSet alloc] init];
// ??? what goes in indexes?

[target insertObjects:itemsToInsert atIndexes:indexes];
XCTAssertEqualObjects((@[@0, @10, @50,  @100]), target);

The apple documentation并没有真正解释它是如何工作的 - 它意味着索引集将按顺序处理......如果是这种情况,那么逻辑上我应该这样做:

[indexes addIndex:1]; // insert @50 at position 1
[indexes addIndex:1]; // insert @10 at position 1, pushing @50 up to position 1

问题是,这不起作用 - 插入会引发[NSMutableArray insertObjects:atIndexes:]: count of array (2) differs from count of index set (1)

的异常

我也试过了:

  • 插入索引范围 - 失败并出现相同的异常
  • 插入1, 2的索引 - 这导致@[@0, @50, @10, @100]
  • 的结果不正确
  • 插入2, 1的索引 - 此的结果不正确@[@0, @50, @10, @100]

这可能吗?我可以通过在插入项目之前对项目列表进行预先排序来解决它,但是不必创建列表的临时副本会很好

1 个答案:

答案 0 :(得分:1)

NSIndexSet仅包含“唯一无符号整数”,存储为“已排序范围”。你试图用索引集做的事情是行不通的。

如果您使用数组来保存索引,则可以并行循环访问值和索引并重复使用insertObject:atIndex:。通过向NSMutableArray添加类别方法可以简化这一过程,例如OEInsertObjects:atOrderedIndexes:然后你的第一个方法,在索引1重复插入,会起作用,虽然这对我来说很奇怪,因为你总是有将这些动作考虑在内。