2015-05-05 60 views
-1

,我无法理解这样的代码示例:Objective-C的块如需要我是新来的Objective-C,我是继苹果公司的“编程与Objective_C”解释

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

我期待这种模式:

ReturnType ^(blockVariableIdentifier)(ParameterType1, ParameterType2, ...) = ^{ 
    //some code 
    }; 
  1. 是如何blockVariableIdentifier repleaced与(^complexBlock)(void (^)(void))
  2. 是不是应该有void作为回报,那么我们有没有return { ... }

我觉得这段代码很混乱,你能解释一下吗?

代码source

更新:

鉴于这种类型定义:

typedef void (^XYZSimpleBlock)(void);

我可以简化complexBlock的声明:

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

,但我还是不明白这是如何相当于

XYZSimpleBlock (^betterBlock)(XYZSimpleBlock);

+1

这很混乱,你不明白什么?或者,也许这很容易,你能写下你的想法/理解/不明白的东西吗?通过这种方式,我们可以简单地纠正你错误的地方,而不是失望,因为看起来你没有付出太多努力:P –

+0

增加了更多细节。 –

+1

@AmrLotfy我更新了我的答案''typedef' of'XYZSimpleBlock'和一些返回类型的解释 – Azat

回答

4

它是在你的link说那里:

的complexBlock变量是指需要另一块作为一个参数(ABLOCK)并返回另一个块的块。

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

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

betterBlock返回类型为XYZSimpleBlock,所以你从那里返回另一个块。 void只为XYZSimpleBlock涉及,看它的typedef - 块有没有参数,不返回任何

而且this awesome answer将是你

1

有用根据本answer(在上面@Ahmed Lotfy的评论中发现)这仅仅是一个语言/编译器设计的问题,而是要visuailze怎么发生的我做了这个形象:

  1. 预期的语法(上图),其采用块作为参数,并返回一个块的块,即不被Xcode接受。

  2. 设置的语法(底部)。

enter image description here

视觉所发生的事情只是切割盒装)(void)并把它在最后。刚刚通过替换f()(^myBlock)(void (^) (void))这是块以另一块是没有返回参数

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

,我们可以把它看作类似于一个载体作用返回一个块。

我希望我们能忍受这一点。