我正在使用Objective-C块,但是我在理解下面的代码执行时遇到了麻烦。
以下是代码:
NSArray *array = @[@"A", @"B", @"C", @"A", @"B", @"Z", @"G", @"are", @"Q"];
NSSet *filterSet = [NSSet setWithObjects: @"A", @"Z", @"Q", nil];
BOOL (^test)(id obj, NSUInteger idx, BOOL *stop);
test = ^(id obj, NSUInteger idx, BOOL *stop) {
if (idx < 5) {
if ([filterSet containsObject: obj]) {
return YES;
}
}
return NO;
};
NSIndexSet *indexes = [array indexesOfObjectsPassingTest:test];
NSLog(@"indexes: %@", indexes);
输出:
indexes: <NSIndexSet: 0x10236f0>[number of indexes: 2 (in 2 ranges), indexes: (0 3)]
在此方法[array indexesOfObjectsPassingTest:test];
中,test
块是我传递的参数。
但是在上面的块中,test = ^(id obj, NSUInteger idx, BOOL *stop)
它可以采用的参数obj
,idx
和stop
的值是多少?他们来自哪里?
答案 0 :(得分:2)
您的阵列中有9个项目。所以test
块执行了9次
每次,obj都将成为数组中的对象。 idx将成为索引。
第一次:obj = @“A”idx = 0
第二次:obj = @“B”idx = 1
等
如果您想提前退出, stop
是您可以写入的值。因此,如果在第5次通过块,你不想再这样做了。你可以做*stop=YES;