- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我最近一直在使用 enumerateObjectsUsingBlock:
来满足我的快速枚举需求,但我很难理解 BOOL *stop
在枚举 block 。
NSArray
类引用状态
stop
: A reference to a Boolean value. The block can set the value toYES
to stop further processing of the array. Thestop
argument is an out-only argument. You should only ever set this Boolean toYES
within the Block.
那么我当然可以在我的 block 中添加以下内容来停止枚举:
if (idx == [myArray indexOfObject:[myArray lastObject]]) {
*stop = YES;
}
据我所知,不明确将 *stop
设置为 YES
不会产生任何负面影响。枚举似乎在数组末尾自动停止。那么在一个 block 中使用 *stop
真的有必要吗?
最佳答案
Block 的 stop
参数允许您提前停止枚举。它相当于普通 for
循环中的 break
。如果要遍历数组中的每个对象,可以忽略它。
for( id obj in arr ){
if( [obj isContagious] ){
break; // Stop enumerating
}
if( ![obj isKindOfClass:[Perefrigia class]] ){
continue; // Skip this object
}
[obj immanetizeTheEschaton];
}
[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if( [obj isContagious] ){
*stop = YES; // Stop enumerating
return;
}
if( ![obj isKindOfClass:[Perefrigia class]] ){
return; // Skip this object
}
[obj immanentizeTheEschaton];
}];
这是一个 out 参数,因为它是对来自调用范围的变量的引用。它需要在你的 Block 中设置,但在 enumerateObjectsUsingBlock:
中读取,就像 NSError
通常从框架调用传回你的代码一样。
- (void)enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))block {
// N.B: This is probably not how this method is actually implemented!
// It is just to demonstrate how the out parameter operates!
NSUInteger idx = 0;
for( id obj in self ){
BOOL stop = NO;
block(obj, idx++, &stop);
if( stop ){
break;
}
}
}
关于objective-c - enumerateObjectsUsingBlock : used for? 的 BOOL *stop 参数是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12357904/
我需要遍历 NSArray 来计算一些指标(总高度)。这是我的代码: __block CGFloat height = someInitialValue; [messages enumerateObj
我有这样的情况,我正在使用 enumerateObjectsUsingBlock 迭代我的数组对象,我需要等待迭代完成然后它应该执行进一步的代码,我怎样才能实现这个,或者如果我应该使用任何替代方法,下
在以下代码片段 (self.searchResults) 中调用 self 时,我是否应该使用 weakSelf: [self.restaurants enumerateObjectsUsingBlo
我有一个 NSMutableOrderedSet。 我需要枚举它,看起来唯一构建到集合上的选项是基于 block 的。所以选择最简单的基于 block 的选项,我有这样的东西...... [anNSM
给这个代码 NSMutableArray *array = [NSMutableArray new]; for (int i = 0; i < 10000; i++) { [array add
当我在 NSArray 上搜索 enumerateObjectsUsingBlock 时,偶然去了 NSSet Class Reference,它提供了相同的方法签名...... Doc 说 Exec
我使用快速枚举并在枚举 block 中异步发送网络请求。 那么 enumerateObjectsUsingBlock 会发生什么:只需超快地调用 block 并让枚举 block 在一段时间后完成。
我想知道如何将以下内容转换为 Swift。我已经尝试过了,但一直停留在一个概念上: 我正在使用我的属性 UICollectionViewLayoutAttributes 遍历所有对象 [newVisi
我想引用具有特定类型的枚举对象,而不仅仅是通用的 AnyObject!,但在文档中找不到任何关于它的信息。 enumerateObjectsUsingBlock 在 Swift 中的签名是: func
以下两种方式的优缺点是什么: enumerate using block NSArray *myArray = [NSArray new]; [myArray enumerateObjectsUsin
如何停止区 block 枚举? myArray.enumerateObjectsUsingBlock( { object, index, stop in //how do I
除了明显的区别: 同时需要索引和对象时使用 enumerateObjectsUsingBlock 当你需要修改局部变量时不要使用enumerateObjectsUsingBlock(我错了,看bbum
我遇到了以下编译错误: Cannot invoke 'enumerateObjectsUsingBlock' with an argument list of type '((_, _, _) ->
这是一个错误吗? 我有这样几行: [myArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { NS
在 Swift 2.2 之前,我可以通过使用 var 使停止参数可变然后适本地设置它来停止枚举 stop = UnsafeMutablePointer.alloc(NSNumber(bool: tru
我在将此 block 代码从 Objective C 转换为 Swift 时遇到了问题。我在网上搜索了一些示例,但没有一个修复了我遇到的错误。 如有任何帮助,我们将不胜感激。 - (void)didR
这个问题在这里已经有了答案: Collection was mutated while being enumerated error in objective C (6 个答案) 关闭 9 年前。
这个问题在这里已经有了答案: What is the BOOL *stop argument for enumerateObjectsUsingBlock: used for? (1 个回答) 关闭
我正在从我的 json 文件中读取 jason 数据,并且我成功打印了 NSarray 类型 arraytsik,现在当我尝试使用 enumerateObjectsUsingBlock 循环遍历 ar
我最近一直在使用 enumerateObjectsUsingBlock: 来满足我的快速枚举需求,但我很难理解 BOOL *stop 在枚举 block 。 NSArray 类引用状态 stop: A
我是一名优秀的程序员,十分优秀!