NSIndexSet

NSIndexSet可以用来存储一系列的索引值区间,索引值可以使用单个的NSUInteger或者NSRange来表示。而且和许多其他集合类型一样,它有不可变和可变的执行,分别对应NSIndexSet类型和NSMutableIndexSet类型。NSIndexSet可以通过一个NSUinteger,NSRange或者另一个NSIndexSet来创建。也可以使用NSMutableIndexSet来多次添加NSUinteger或者NSRange对象。

比如创建一个NSMutableIndexSet对象,加入数据,然后枚举所有的索引值:

NSMutableIndexSet *idxSet = [[NSMutableIndexSet alloc] init];
//添加5和2
[idxSet addIndex:5];
[idxSet addIndex:2];
//添加7-10
[idxSet addIndexesInRange:NSMakeRange(7, 4)];

[idxSet enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop)
{
     NSLog(@"%lu", (unsigned long)idx);
}];
输出:
2
5
7
8
9
10

NSIndexSet还支持其他方式的枚举方法,比如可以取一个NSRange范围中的交集,然后还可以以相反的顺序进行枚举。

这个需求需要使用NSIndexSet的enumerateIndexesInRange:options:usingBlock:方法,如下代码:

NSMutableIndexSet *idxSet = [[NSMutableIndexSet alloc] init];
//添加5和2
[idxSet addIndex:5];
[idxSet addIndex:2];
//添加7-10
[idxSet addIndexesInRange:NSMakeRange(7, 4)];
//idxSet包含的区间:2, 5, 7 - 10
//取交集:3 – 8

[idxSet enumerateIndexesInRange:NSMakeRange(3, 6) options:NSEnumerationReverse usingBlock:^(NSUInteger idx, BOOL *stop)
{
     NSLog(@"%lu", (unsigned long)idx);
}];
输出:
8
7
5

由于NSIndexSet本身的区间是:2,5,7 – 10。然后取交集的区间是3 – 8。最后倒序枚举,所以会输出8,7,5。

NSIndexSet同时还包含许多方法判断是否包含某区间或者从一个索引值内获取临近的区间内的索引。如下代码:

NSMutableIndexSet *idxSet = [[NSMutableIndexSet alloc] init];
//添加5和2
[idxSet addIndex:5];
[idxSet addIndex:2];

//判断是否包含3 - 5
NSLog(@"%d", [idxSet containsIndexesInRange:NSMakeRange(3, 2)]);
//从4起找到最近的等于或者大于的索引值
NSLog(@"%lu", (unsigned long)[idxSet indexGreaterThanOrEqualToIndex:4]);
输出:
0
5

还可以使用NSIndexSet的indexesInRange:options:passingTest:方法来根据要求返回另一个NSIndexSet。操作过程和上面讲的enumerateIndexesInRange:options:usingBlock:方法类似,只不过Block参数需要返回一个BOOL,通过这个BOOL来决定元素是否被加入到返回的NSIndexSet对象中。

代码:

NSMutableIndexSet *idxSet = [[NSMutableIndexSet alloc] init];
//添加5和2
[idxSet addIndex:5];
[idxSet addIndex:2];
//添加7-10
[idxSet addIndexesInRange:NSMakeRange(7, 4)];

//从NSRange的交集中倒着枚举
NSIndexSet *subSet = [idxSet indexesInRange:NSMakeRange(3, 6) options:NSEnumerationReverse passingTest
^BOOL(NSUInteger idx, BOOL *stop)
{
     NSLog(@"> %lu", (unsigned long)idx);
     return idx % 2;
}];
//枚举subSet
[subSet enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop)
{
     NSLog(@"%lu", (unsigned long)idx);
}];
输出:
> 8
> 7
> 5
5
7

最后的方法就是NSArray的objectsAtIndexes,该方法可以根据一个NSIndexSet所在的区间返回数组相应的成员。

代码:

NSMutableIndexSet *idxSet = [[NSMutableIndexSet alloc] init];
[idxSet addIndex:2];
[idxSet addIndexesInRange:NSMakeRange(5, 3)];

NSArray *arr = @[@0, @1, @2, @3, @4, @5, @6, @7, @8, @9];
NSArray *res = [arr objectsAtIndexes:idxSet];

for(id item in res) {
    NSLog(@"%@", item);
}
输出:
2
5
6
7
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 最近在看公司代码中发现了一个不常见的方法: NSIndexSet *indexSet = [NSIndexSet ...
    弹钢琴的安徒生阅读 12,244评论 0 2
  • 关于删除UITableView分组的方法 tableView 刷新分区的方法: [tableView rel...
    petter102阅读 3,907评论 0 3
  • NSIndexset NSIndexSet同时还包含许多方法判断是否包含某区间或者从一个索引值内获取临近的区间内的...
    Rxiaobing阅读 5,729评论 0 0
  • NSIndexSet类代表一个不可变的独特的无符号整数的集合,称为索引,因为使用它们的方式。这个集合被称为索引集。...
    LeoAu阅读 21,055评论 7 20
  • NSArray全部API学习。 返回数组指定下标的元素 - ()objectAtIndex:(NSUInteger...
    ElvisSun阅读 4,237评论 0 2

友情链接更多精彩内容