数组的快速枚举enumerateObjectsUsingBlock,一个简单的例子
NSMutableArray *sections = [[NSMutableArray alloc]init];
for (int i =1; i<10; i++) {
NSMutableArray *rows = [[NSMutableArray alloc]init];
for (int j = 0; j<i; j++) {
[rows addObject:@(j)];
}
[sections addObject:rows];
}
[sections enumerateObjectsUsingBlock:^(id _Nonnull section, NSUInteger sectionIdx, BOOL * _Nonnull sectionStop) {
NSArray *rows = section;
[rows enumerateObjectsUsingBlock:^(id _Nonnull row, NSUInteger rowIdx, BOOL * _Nonnull rowStop) {
if ([row isEqualToNumber:@(5)]) {
*rowStop = YES;
*sectionStop = YES;
}
}];
}];
是一个双重的快速枚举找到target,并跳出的例子。
需要注意的是:
1.block的context在关联上下文时,会采用就近原则,即最近的作用域有某个名为foo的参数时,上一个作用域里面的foo参数就不会覆盖引入block的上下文;
2.使用block实现的遍历器,也遵循函数参数传递的基本法;
①通俗的说,函数的形参,如果外部需要感知函数内部对形参的修改,形参赋值需要进行址操作;
②遍历器是在每次循环开始时,才判断一次stop的值,因此在block内部,任意位置stop置为YES,并不会立即停止该次循环,而是需要等该次循环执行结束后才触发遍历器的跳出条件。