在之前的文章中转载过iOS中集合遍历方法的比较和技巧, 有兴趣的可以了解一下. 本文主要是介绍enumerateObjects遍历方法.
遍历的目的是获取集合中的某个对象或执行某个操作,所以能满足这个条件的方法都可以作为备选:
在enumerateObjects遍历有3个方法, 这个遍历方式的优点:
1.遍历顺序有正序/倒序/并发混序三种, 可根据枚举值控制比 for循环方便许多.
2.遍历中自带 *stop参数, 跳出方便.
3.可以在遍历的 block中增删数据, 比 forin遍历方便许多
4.在庞大的数据量下, 此方式是比 for循环, forin 等方式,要快许多的方式.在其执行过程中可以利用到多核cpu的优势
NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5", nil];
//按顺序对 arr 进行遍历
[arr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"%ld===%@",idx,obj);
if (idx == 4){
*stop = YES;
}
}];
打印结果:
0===1
1===2
2===3
3===4
4===5
option参数:
//NSEnumerationReverse 倒序执行
//NSEnumerationConcurrent 并行发生, 并发混序
NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5", nil];
[arr enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"%ld===%@",idx,obj);
if (idx == 3){
*stop = YES;
}
}];
打印结果:
0===1
4===5
1===2
2===3
3===4
(NSIndexSet *)s参数: 需要遍历的下标 set
NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5", nil];
//根据indexSet 中包含的下标, 在 arr 中进行遍历
// NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:1];
NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(2, 2)];
[arr enumerateObjectsAtIndexes:indexSet options:NSEnumerationReverse usingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"%ld===%@",idx,obj);
}];
打印结果:
3===4
2===3