rua*_*dao 2 objective-c ios objective-c-blocks
关于教程promgrammingWithObjectiveC.
在处理返回块或将其他块作为参数的块时,自定义类型定义特别有用.请考虑以下示例:
void (^(^complexBlock)(void (^)(void)))(void) = ^ (void (^aBlock)(void)) {
...
return ^{
...
};
};
Run Code Online (Sandbox Code Playgroud)
complexBlock变量引用一个块,该块将另一个块作为参数(aBlock)并返回另一个块.
重写代码以使用类型定义使这更具可读性:
typedef void (^XYZSimpleBlock)(void);
XYZSimpleBlock (^betterBlock)(XYZSimpleBlock) = ^ (XYZSimpleBlock aBlock) {
...
return ^{
...
};
};
Run Code Online (Sandbox Code Playgroud)
我的重写代码:
但我无法理解源代码:
void (^(^complexBlock)(void (^)(void)))(void) = ^ (void (^aBlock)(void)) {
...
return ^{
...
};
}
Run Code Online (Sandbox Code Playgroud)
据我所知,它应该是:
(void (^) (void)) (^complexBlock) (void (^)(void) = ^ (void (^aBlock)(void)) {
...
return ^{
...
};
};
Run Code Online (Sandbox Code Playgroud)
使用类似于用于声明指向函数的指针的语法来声明块,除了您使用^而不是*.
因此函数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
更一般地说,有一种称为 "顺时针/螺旋规则"的技术 ,您可以使用它来"解析"C声明.螺旋规则也适用于块.
或者使用cdecl Cgibberish↔English,在您的情况下 返回
declare complexBlock as block (block (void) returning void) returning block (void) returning void
| 归档时间: |
|
| 查看次数: |
191 次 |
| 最近记录: |