Objective-C中的块语法问题 - 带返回类型和参数的typedef块

时间:2013-03-12 23:43:08

标签: objective-c objective-c-blocks

我有个街区:

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的

3 个答案:

答案 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*