【问题标题】:Problems with block syntax in Objective-C - typedef block with return type and argumentsObjective-C 中的块语法问题 - 带有返回类型和参数的 typedef 块
【发布时间】:2013-03-12 23:43:08
【问题描述】:

我有一个障碍:

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

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

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

requestCompletedBlock 显然是 completionBlock 类型。

我收到以下错误:

“分配给 'completionBlock' 的不兼容块指针类型(又名 'id (^)(_strong id, NSURLResponse *_strong, NSError *__strong)')来自 'void *(^)( _强 id,NSURLResponse *_strong,NSError *__strong)'"

显然我的语法在某处有错误,但在哪里?

非常感谢,

Vb

【问题讨论】:

    标签: objective-c objective-c-blocks


    【解决方案1】:

    无论出于何种原因,编译器都会推断您的内联块的返回类型是void*,而不是id。您可以强制它使用id 的返回类型,方法是将返回类型放在^ 之后,如下所示:

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

    有关块语法的详细说明,请参阅this page

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        您的objectvoid* 类型,但您的块希望您返回id。这意味着您应该将object 包装成NSData*

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

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

        【讨论】:

          猜你喜欢
          • 2012-01-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多