Objective C(我猜确实是 C)中的 block 语法是出了名的不协调。将 block 作为参数传递看起来与将 block 声明为 ivars 不同,后者看起来与 typedef
ing block 不同。
是否有一个完整的 block 声明语法列表可供我快速引用?
最佳答案
block 声明语法列表
从头到尾,让
return_type
是 object/primitive/etc 的类型。你想返回(通常是void
)blockName
是你正在创建的 block 的变量名var_type
是类型 object/primitive/etc。您想作为参数传递(留空表示无参数)varName
是给定参数的变量名
请记住,您可以创建任意数量的参数。
block 作为变量
可能是最常见的声明。
return_type (^blockName)(var_type) = ^return_type (var_type varName)
{
// ...
};
block 作为属性
很像将 block 声明为变量,但略有不同。
@property (copy) return_type (^blockName) (var_type);
block 作为参数
请注意,这与“作为参数的 block ”不同;在本例中,您声明了一个需要 block 参数的方法。
- (void)yourMethod:(return_type (^)(var_type))blockName;
block 作为参数
请注意,这与“作为参数的 block ”不同;在这种情况下,您正在调用一个需要带有匿名 block 的 block 参数的方法。如果你已经声明了一个 block 变量,将变量名作为参数传递就足够了。
[someObject doSomethingWithBlock: ^return_type (var_type varName)
{
//...
}];
匿名 block
这在功能上是一个匿名 block ,但是将 block 分配给变量的语法只是将变量设置为等于匿名 block 。
^return_type (var_type varName)
{
//...
};
typedef
block
这允许您设置一个短名称,在声明 block 时可以像任何其他类名一样引用它。
typedef return_type (^blockName)(var_type);
以后要使用 blockName
代替标准 block 声明语法,只需替换即可。
内联 block
这可以说是对方 block 的一种不太有用的利用,但仍然可能有它的位置。内联 block 是在实例化后立即调用的匿名 block 。
^return_type (var_type varName)
{
//...
}(var);
内联 block 主要用于范围偏移,大致相当于简单的大括号分隔的代码块。
{
//...
}
递归 block
这允许您从自身调用一个 block ,创建一个可在回调和 GCD 调用期间使用的循环。这种实例化方法在 ARC 中没有保留循环。
__block return_type (^blockName)(var_type) = [^return_type (var_type varName)
{
if (returnCondition)
{
blockName = nil;
return;
}
// ...
} copy];
blockName(varValue);
返回 block
一个方法可以返回一个 block ,
- (return_type(^)(var_type))methodName
{
// ...
}
一个函数也可以,如果有点奇怪的话。
return_type (^FunctionName())(var_type)
{
// ...
}
附录
如果我遗漏了什么,请在评论中告诉我,我会研究/添加它们。
哦,在 Swift 中...
blockName = (varName: var_type) -> (return_type)
这几乎就像是一种语言功能。
关于objective-c - block 声明语法列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9201514/