我有个街区:
typedef id (^completionBlock)(id data, NSURLResponse *urlResponse, NSError *error);
在类方法中,我尝试用一些代码填充这个块。
request.requestCompletedBlock = ^(id data, NSURLResponse *urlResponse, NSError *error){
...
return object;
};
requestCompletedBlock显然属于completionBlock类型。
我收到以下错误:
“不兼容的块指针类型从'void *(^)分配给'completionBlock'(又名'id(^)(_ 强id,NSURLResponse * _strong,NSError * __ strong)') _ 强ID,NSURLResponse * _strong,NSError * __ strong)'“
显然我的语法在某处错了,但在哪里?
非常感谢,
Vb的
答案 0 :(得分:7)
无论出于何种原因,编译器都推断内联块的返回类型为void*
,而不是id
。您可以强制它使用返回类型id
,将返回类型放在^
之后,如下所示:
request.requestCompletedBlock = ^id (id data, NSURLResponse *urlResponse, NSError *error) {
// ~~
// Return type
}
有关块语法的详细说明,请参阅this page。
答案 1 :(得分:1)
编译器推断“对象”类型的“void *”。您可以显式声明文字的返回类型,如下所示:
^id(id data, ...) { ... }
答案 2 :(得分:1)
您的语法是正确的,这是您错误的数据类型。
您的object
类型为void*
,但是您的阻止期望您返回id
。这意味着您应该将object
包裹到NSData*
,
request.requestCompletedBlock = ^(id data, NSURLResponse *urlResponse, NSError *error){
...
return (id)[NSData dataWithBytes:object length:numBytes];
};
或更改completionBlock
的声明以期望返回类型为void*
。