小编典典

块声明语法列表

all

众所周知,Objective C 中的块语法(实际上是 C,我想)是不协调的。将块作为参数传递看起来与将块声明为 ivars
不同,后者看起来与typedefing 块不同。

是否有一个完整的块声明语法列表可供我快速参考?


阅读 81

收藏
2022-05-05

共1个答案

小编典典

块声明语法列表

在整个过程中,让

  • return_type是对象/原始/等的类型。你想回来(通常void
  • blockName是您正在创建的块的变量名
  • var_type是类型对象/原始/等。您想作为参数传递(无参数留空)
  • varName是给定参数的变量名

请记住,您可以创建任意数量的参数。

块作为变量

可能是最常见的声明。

return_type (^blockName)(var_type) = ^return_type (var_type varName)
{
    // ...
};

块作为属性

就像将块声明为变量一样,但有细微的不同。

@property (copy) return_type (^blockName) (var_type);

块作为参数

请注意,这与“作为参数的块”不同;在这种情况下,您要声明一个需要块参数的方法。

- (void)yourMethod:(return_type (^)(var_type))blockName;

块作为参数

请注意,这与“作为参数的块”不同;在这种情况下,您正在调用一个需要带有匿名块的块参数的方法。如果您已经声明了一个块变量,则将变量名作为参数传递就足够了。

[someObject doSomethingWithBlock: ^return_type (var_type varName)
{
    //...
}];

匿名块

这在功能上是一个匿名块,但是将块分配给变量的语法只是将变量设置为等于匿名块。

^return_type (var_type varName)
{
    //...
};

typedef堵塞

这允许您设置一个短名称,可以在块声明期间像任何其他类名称一样引用。

typedef return_type (^blockName)(var_type);

以后要使用blockName标准块声明语法来代替,只需替换即可。

内联块

这可以说是对块的不太有用的利用,但仍然可能有它的位置。内联块是在实例化后立即调用的匿名块。

^return_type (var_type varName)
{
    //...
}(var);

内联块主要用于范围偏移,大致相当于简单的大括号分隔的代码块。

{
   //...
}

递归块

这允许您从自身调用一个块,创建一个可以在回调和 GCD 调用期间使用的循环。这种实例化方法在 ARC 中没有保留循环。

__block return_type (^blockName)(var_type) = [^return_type (var_type varName)
{
    if (returnCondition)
    {
        blockName = nil;
        return;
    }

    // ...
} copy];
blockName(varValue);

返回块

一个方法可以返回一个块,

- (return_type(^)(var_type))methodName
{
    // ...
}

一个函数也可以,如果有点奇怪的话。

return_type (^FunctionName())(var_type)
{
    // ...
}

附录

如果我遗漏了什么,请在评论中告诉我,我会研究/添加它们。

哦,在斯威夫特…

blockName = (varName: var_type) -> (return_type)

这几乎就像它是一种语言功能。

2022-05-05