了解复杂的块语法

阿里·罗斯

我是Objective C和iOS开发的初学者,但是具有13年的.NET经验。我很难在脑海中绘制以下声明,这些声明来自“ Objective C编程指南”:

void (^(^a)(void (^) (void))) (void) = ...

它用作说明为什么要使用typedef块定义的示例,但是我想了解我正在寻找的内容,以便更好地首先了解块定义语法。

到目前为止,这是我的图解方式:

在此处输入图片说明

我遇到问题的地方是我如何理解基本语法:

[return_val] (^[block_name]) ([block_args]) = ...

如果是这种情况,那么我所拥有的就是一个返回void且没有参数的块,而是被命名为(^a) (void (^) void)意思是我的代码块名称本身不是一个直线,而是一个字符串。

显然,我在这里错过了一些东西。有人可以说明一下吗?根据该站点,它可以简化为:

typedef void (^SimpleBlock) (void);
SimpleBlock (^complexBlock) (SimpleBlock) = ...

我只是想念如何。

编辑:第三个空格应该放在括号中。我修好了。图片中的图片有误,但我不想为此重做整个图片。:)如果原来是我的问题的根源,我将在这里修复。

Merlevede

在您的示例中,您缺少第三个括号 void

void (^(^a)(void (^)(void)))(void)

现在让我们分解一下。从函数返回块的基本语法是:

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

在此示例中,返回的块不带参数,并返回void

现在,让我们构建您的示例。

void     (^myBlock)(void);                       // Block returning void, taking no args
void     (^myBlock)(void (^)(void));             // Block returning void, taking block as arg
int      (^myBlock)(void (^)(void));             // Block returning int, taking block as arg
void (^  (^myBlock)(void (^)(void))  )(void);    // Block returning block, taking block as arg

我将每行的中心部分对齐以使其更易于阅读。因此,困难的部分似乎正在返回一个块。在最后一行中,我们使用了我先前描述的语法来从函数返回一个块。

显然,typedefs这使它更容易阅读。

编辑:
下面这个例子,其中,在第一线,我更换intblock直观的回报语法:

void (^ )(void) (^myBlock)(void (^)(void));          // Syntax we 'intuitively would use'
void (^         (^myBlock)(void (^)(void))  )(void); // Official syntax

我不确定要说什么,但我百分百怀疑这种奇怪语法的原因是为了避免编译器中的解析器混乱。第一种“直观”语法会使编译器认为我们有一个不带任何参数块返回void,而其余​​字符将被视为语法错误。

在我看来,语法是您不需过多质疑的东西(您当然可以批评它),因为它是语言设计的一部分,我们必须遵循规则(由一些有希望的聪明的工程师制定)代码进行编译。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章