2013-03-12 49 views
2

我有一个块:问题与Objective-C的语法块 - 与返回类型的typedef块和参数

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

而且在一个类的方法我尝试填充一些代码块。

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

requestCompletedBlock显然是completionBlock类型的。

我收到以下错误:

“不兼容的块指针类型分配给 'completionBlock'(又名 '号(^)(_ 强大的ID,NSURLResponse * _strong,NSError * __强)')从“ void *(^)(_ strong id,NSURLResponse * _strong,NSError * __ strong)'“

显然我的语法在某处出错了,但是在哪里呢?

非常感谢,

Vb的

回答

7

无论出于何种原因,编译器推断你的内联块的返回类型void*,不id。您可以强制它通过将返回类型^像这样使用后的id返回类型:

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

块语法的详细说明,请参见this page

1

编译器推断 “无效*” 的 “对象” 的类型。您可以显式声明字面的返回类型,像这样:

^id(id data, ...) { ... } 
1

你的语法是正确的,它是你错误的数据类型。

您的object类型为void*,但您的区块希望您返回id。这意味着你要么换object到,比方说,NSData*

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

或改变completionBlock申报期待的void*返回类型。