Objective-C块示例需要解释

时间:2015-05-05 13:36:25

标签: ios objective-c macos

我是Objective-C的新手,我正在关注Apple"使用Objective_C编程",我无法理解这段代码示例:

void (^(^complexBlock)(void (^)(void)))(void) = ^ (void (^aBlock)(void)) {
 //some code
 return ^{
 //some code
 };
};

我期待这种模式:

ReturnType ^(blockVariableIdentifier)(ParameterType1, ParameterType2, ...) = ^{  
   //some code
   };
  1. blockVariableIdentifier(^complexBlock)(void (^)(void))如何重复?
  2. 它不应该以{{1​​}}作为回报,我们怎么来void
  3. 我发现这段代码令人困惑,你能解释一下吗?

    代码source

    更新

    鉴于此typedef:

    return { ... }

    我可以将typedef void (^XYZSimpleBlock)(void);的声明简化为:

    complexBlock

    但我仍然无法弄清楚这与

    相同

    void (^(^complexBlock)(XYZSimpleBlock))(void);

2 个答案:

答案 0 :(得分:4)

据说你的link

  

complexBlock变量引用一个块,该块将另一个块作为参数(aBlock)并返回另一个块。

这只是返回另一个块的块。该代码也有简化:

typedef void (^XYZSimpleBlock)(void);
XYZSimpleBlock (^betterBlock)(XYZSimpleBlock) = ^(XYZSimpleBlock aBlock) {
    ...
    return ^{
        ...
    };
};

betterBlock的返回类型为XYZSimpleBlock,因此您可以从那里返回另一个块。 void仅与XYZSimpleBlock相关,请查看其typedef - 没有参数且不返回任何内容的块

同样this awesome answer对您有用

答案 1 :(得分:1)

根据这个answer(在@Ahmed Lotfy上面的评论中找到),这只是一个语言/编译器设计的问题,但为了观察我是如何发生这种情况的:

  1. 以块作为参数并返回块的块的预期语法(顶部),Xcode不接受该块。

  2. 设计语法(底部)。

  3. enter image description here

    视觉上发生的事情只是切割盒装)(void)并将其放在最后。

    我们可以看到它类似于返回块的功能:

    void (^f())(void) { 
     return ^{ ... }; 
    }
    

    只需将f()替换为(^myBlock)(void (^) (void)),这是一个将另一个块作为参数而不返回的块。

    我希望我们可以忍受。