gpt4 book ai didi

objective-c - 在 Objective-C 中定义接受一个 Block 并返回一个 Block 的 Block 的语法

转载 作者:太空狗 更新时间:2023-10-30 03:25:34 25 4
gpt4 key购买 nike

我在Apple的文档中找到Working with Blocks定义返回两个值相乘结果的 block 的语法:

double (^multiplyTwoValues)(double, double);

不同于定义一个将另一个 block 作为参数并返回另一个 block 的 block :

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

为什么第二种语法不是 void (^)(void)(^complexBlock)(void (^)(void))

最佳答案

这就是 C 语法的工作原理。 block 语法基于 function pointers 的语法,这归结为 Dennis Ritchie 的想法,即“一个事物的声明应该看起来像那个事物的使用”。

如果你要使用你定义的“复杂 block ”,然后在同一行中调用返回的 block ,它看起来像这样:

complexBlock(void (^argBlock)(void){ /*...*/ })();
// ^ Argument (a literal Block) to the main Block
// ^ Invocation of the returned Block

此外,C 声明的解析遵循所谓的"right-left rule"。 .第一步是“找到标识符”。对于您的声明,这是 complexBlock

void (^(^complexBlock)(void (^)(void)))(void);
// | ! | Found identifier: "complexBlock is..."

然后,向右看。我们打了一个右括号,所以这是声明“单元”的结尾。

void (^(^            )(void (^)(void)))(void);
// | ! Right parenthesis closes a part of the declaration

回到当前部分的开头,向左阅读直到出现左括号。我们发现插入符号表示 block 类型。继续向左阅读,找到一个左括号,结束声明的这一部分。

void (^(^             (void (^)(void)))(void);
// |! | "...a Block..."

接下来,再往右走。在这里我们找到一个左括号,表示参数列表的开始。跳过参数列表,因为您关心的是返回类型,但它被解析为独立声明。

void (^              (void (^)(void)))(void);
// | ! | "...taking something or other and returning..."

现在我们已经使用了参数列表:

void (^                              )(void);
// | |

继续向右移动,我们遇到了一个右括号:

void (^                              )(void);
// | !

因此,再次回到当前部分的开头并向左移动我们找到 Block 插入符的位置。

void (^                               (void);
// ! | "...a Block.."

以下是您关于此声明的问题的关键部分:

向左移动,我们再次找到左括号,所以我们返回向右移动。这就是为什么返回 block 的参数列表位于声明末尾的原因。

void (                                (void);
// ! | Left parenthesis closes part of declaration,
// **now move rightwards again**

经历了所有这些,剩下的应该是不言而喻的。

顺便说一下,我链接到的关于左右规则的页面有一些像我这样的演示,其中一个涉及函数指针。您可能还会被http://cdecl.org逗乐,这是一个解析 C 声明的程序的在线实现,可以帮助您理解 woolier 变体。

关于objective-c - 在 Objective-C 中定义接受一个 Block 并返回一个 Block 的 Block 的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27162567/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com