gpt4 book ai didi

ios - 了解复杂的 block 语法

转载 作者:技术小花猫 更新时间:2023-10-29 10:49:58 24 4
gpt4 key购买 nike

我是 Objective C 和 iOS 开发的初学者,但是 13 年的 .NET 老手。我很难在脑海中画出以下来自 Programming with Objective C 的声明指南:

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

它被用作为什么应该使用 typedef 来定义 block 的示例,但我想了解我正在查看的内容,以便首先更好地了解 block 定义语法。

到目前为止,这是我绘制的图表:

enter image description here

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

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

如果是这样,那么我得到的是一个返回 void 且没有参数的 block ,但名为 (^a) (void (^) void)。这意味着我的 block 的名称本身就是一个 block ,而不是一个直字符串。

显然我在这里遗漏了一些东西。有人可以解释一下吗?根据该网站,它简化为:

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

我只是想念如何。

编辑:第三个空白应该在括号中。我修好了。图像中有错误,但我不想为此重做整个图像。 :) 如果它是我的问题的根源,我会在这里修复它。

最佳答案

在您的示例中,third void

缺少一些括号
void (^(^a)(void (^)(void)))(void)

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

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

在此示例中,返回的 block 不接受任何参数并返回 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

我已将每行的中心部分对齐,以使其更易于阅读。所以困难的部分似乎是返回一个 block 。在最后一行中,我们使用了我之前描述的语法从函数返回一个 block 。

显然 typedefs 使其更易于阅读。

编辑:
考虑这个示例,在第一行中,我将 int 替换为 blockintuitive 返回语法:

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

我不是 100% 确定我要说的内容,但我怀疑这种奇怪语法的原因是编译器中的解析器不会混淆。第一个“直观”语法会让编译器认为我们有一个不带任何参数返回 void 的 block ,其余字符将被视为语法错误。

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

关于ios - 了解复杂的 block 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22057215/

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