我是Objective-C的新手,我正在关注Apple"使用Objective_C编程",我无法理解这段代码示例:
void (^(^complexBlock)(void (^)(void)))(void) = ^ (void (^aBlock)(void)) {
//some code
return ^{
//some code
};
};
我期待这种模式:
ReturnType ^(blockVariableIdentifier)(ParameterType1, ParameterType2, ...) = ^{
//some code
};
blockVariableIdentifier
对(^complexBlock)(void (^)(void))
如何重复?void
?我发现这段代码令人困惑,你能解释一下吗?
代码source。
更新
鉴于此typedef:
return { ... }
我可以将typedef void (^XYZSimpleBlock)(void);
的声明简化为:
complexBlock
但我仍然无法弄清楚这与
相同 void (^(^complexBlock)(XYZSimpleBlock))(void);
答案 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上面的评论中找到),这只是一个语言/编译器设计的问题,但为了观察我是如何发生这种情况的:
以块作为参数并返回块的块的预期语法(顶部),Xcode不接受该块。
设计语法(底部)。
视觉上发生的事情只是切割盒装)(void)
并将其放在最后。
我们可以看到它类似于返回块的功能:
void (^f())(void) {
return ^{ ... };
}
只需将f()
替换为(^myBlock)(void (^) (void))
,这是一个将另一个块作为参数而不返回的块。
我希望我们可以忍受。