【问题标题】:How to pass a block as an argument into another block in Objective C如何将块作为参数传递到Objective C中的另一个块
【发布时间】:2011-12-30 18:12:30
【问题描述】:

我正在尝试定义一个将块作为参数的块。

下面这行代码有什么问题?

id (^cacheResult)(NSString *, id(^)(void)) = ^(NSString *name, id(^)(void)block) {
    NSObject *item = nil;
    block();
    return item;
};

为什么编译器老是报Parameter name omittedExpected ")"之类的错误?

【问题讨论】:

    标签: objective-c syntax objective-c-blocks


    【解决方案1】:
    id (^cacheResult)(NSString *, id(^)(void)) = ^(NSString *name, id(^block)(void)) {
        NSObject *item = nil;
        block();
        return item;
    };
    

    块的语法与函数指针相似。您必须在 ^

    之后声明块名称

    【讨论】:

      【解决方案2】:

      这就是typedef 被发明的原因。像这样嵌入函数指针或块类型很痛苦。试试这个:

      typedef id (^ InnerBlock)(void);
      typedef id (^ OuterBlock)(NSString *, InnerBlock);
      

      它将使处理块类型更容易阅读。 :)

      【讨论】:

      • 啊,谢谢你的指点(不是双关语)。我发现块定义有时真的很难阅读,而 typedef 确实是完美的解决方案!虽然我的特殊错误是误解了将块变量名放在哪里。
      【解决方案3】:

      您可能是指作业右侧的id(^block)(void)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-27
        • 1970-01-01
        • 2019-02-13
        • 2011-01-28
        • 1970-01-01
        • 2012-07-04
        • 2023-03-29
        • 2019-06-14
        相关资源
        最近更新 更多