当我在NSArray上搜索enumerateObjectsUsingBlock时,意外地转到提供相同方法签名的NSSet Class Reference ... Doc说
Executes a given Block using each object in the set.
- (void)enumerateObjectsUsingBlock:(void (^)(id obj, BOOL *stop))block
block: The Block to apply to elements in the set.
obj:The element in the set.
stop:A reference to a Boolean value. The block can set the value to YES to stop further processing of the set. The stop argument is an out-only argument. You should only ever set this Boolean to YES within the Block.
Block返回一个布尔值,指示obj是否通过了测试。
返回布尔值是什么?由于块被声明为返回void,并且“stop”参数只能设置为“YES”,它的失败测试消息如何从块中传出?
在我测试期间,我将此方法分配给BOOL,但是编译器警告“使用不兼容类型'void'”的表达式初始化'BOOL'(又名'signed char')
有什么想法吗?
答案 0 :(得分:2)
这是文档中的错误。枚举块永远不会返回任何内容,正如您在块的签名中注意到的那样。
答案 1 :(得分:2)
这是文档中的错误。正如签名所示,块中没有返回BOOL
。
该评论似乎是objectsPassingTest:
等方法的复制/粘贴问题。
文档中每个页面底部都有一个链接,用于报告反馈。让Apple知道错误。
答案 2 :(得分:2)
该块不会返回布尔值。该块传递 引用到布尔值。在块内部,它应设置为YES以指示枚举应该停止。
[items enumerateObjectsUsingBlock:^(id obj, BOOL *stop) {
if (obj == something){
*stop = YES;
}
}];
documentation for NSArray并不表示块返回布尔值:
使用数组中的每个对象执行给定的块,从第一个对象开始,然后通过数组继续到最后一个对象。
块签名表示它返回void。
(void (^)(id obj, BOOL *stop))
第一个空格:( void (^)(id obj,BOOL * stop))是块的返回类型。