我想使用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]
这可能吗?我可以通过在插入项目之前对项目列表进行预先排序来解决它,但是不必创建列表的临时副本会很好
答案 0 :(得分:1)
NSIndexSet
仅包含“唯一无符号整数”,存储为“已排序范围”。你试图用索引集做的事情是行不通的。
如果您使用数组来保存索引,则可以并行循环访问值和索引并重复使用insertObject:atIndex:
。通过向NSMutableArray
添加类别方法可以简化这一过程,例如OEInsertObjects:atOrderedIndexes:
然后你的第一个方法,在索引1重复插入,会起作用,虽然这对我来说很奇怪,因为你总是有将这些动作考虑在内。