关于教程promgrammingWithObjectiveC。
自定义类型定义在处理返回块或将其他块作为参数的块时特别有用。请考虑以下示例:
void (^(^complexBlock)(void (^)(void)))(void) = ^ (void (^aBlock)(void)) {
...
return ^{
...
};
};
complexBlock变量引用一个块,该块将另一个块作为参数(aBlock)并返回另一个块。
重写代码以使用类型定义使这更具可读性:
typedef void (^XYZSimpleBlock)(void);
XYZSimpleBlock (^betterBlock)(XYZSimpleBlock) = ^ (XYZSimpleBlock aBlock) {
...
return ^{
...
};
};
我的重写代码: 但我无法理解源代码:
void (^(^complexBlock)(void (^)(void)))(void) = ^ (void (^aBlock)(void)) {
...
return ^{
...
};
}
据我了解,它应该是:
(void (^) (void)) (^complexBlock) (void (^)(void) = ^ (void (^aBlock)(void)) {
...
return ^{
...
};
};
答案 0 :(得分:5)
使用类似于用于声明指向函数的指针的语法来声明块,除了您使用^
而不是*
。
因此函数analogon将是“指向返回函数指针的函数的指针”, 这里很好地解释了:https://stackoverflow.com/a/10759352/1187415。
如果您将该答案的“构建程序”翻译为您的区块 然后你得到:
complexBlock -- complexBlock ^complexBlock -- is a block (^complexBlock)(void (^)(void)) -- taking a block parameter ^(^complexBlock)(void (^)(void)) -- returning a block (^(^complexBlock)(void (^)(void)))(void) -- taking no parameters void (^(^complexBlock)(void (^)(void)))(void) -- returning void
更一般地说,有一种叫做的技术 "Clockwise/Spiral Rule" 您可以用它来“解析”C声明。螺旋规则有效 对于街区也是如此。
或使用cdecl C gibberish ↔ English中的your case 返回
declare complexBlock as block (block (void) returning void) returning block (void) returning void