2

我有一个块:

typedef id (^completionBlock)(id data, NSURLResponse *urlResponse, NSError *error);

在一个类方法中,我尝试用一​​些代码填充这个块。

request.requestCompletedBlock = ^(id data, NSURLResponse *urlResponse, NSError *error){
  ...
return object;
};

requestCompletedBlock 显然是 completionBlock 类型。

我收到以下错误:

“从 'void *(^)(_ strong id, NSURLResponse * _strong, NSError * __强的)'”

显然我的语法在某个地方是错误的,但是在哪里呢?

非常感谢,

维生素B

4

3 回答 3

7

无论出于何种原因,编译器都在推断您的内联块的返回类型是void*,而不是idid您可以通过将返回类型放在类似的后面来强制它使用返回类型^

request.requestCompletedBlock = ^id (id data, NSURLResponse *urlResponse, NSError *error) {
    //                           ~~
    //                        Return type
}

有关块语法的详细说明,请参阅此页面

于 2013-03-12T23:47:38.370 回答
1

您的语法是正确的,这是您错误的数据类型。

object的类型void*,但你的块期望你返回id。这意味着您应该换行object,比如说NSData*

request.requestCompletedBlock = ^(id data, NSURLResponse *urlResponse, NSError *error){
    ...
    return (id)[NSData dataWithBytes:object length:numBytes];
};

或更改 的声明completionBlock以期望返回类型为void*.

于 2013-03-12T23:51:06.037 回答
1

编译器正在为“对象”的类型推断“void*”。您可以像这样显式声明文字的返回类型:

^id(id data, ...) { ... }
于 2013-03-12T23:45:07.443 回答