块声明语法列表

Objective C中的块语法(实际上C,我假定)是出了名的不协调。 将块作为parameter passing看起来不同于将块声明为ivars,这看起来与typedef块不同。

是否有一个完整的块声明语法列表,我可以随时为您提供快速参考?

块声明语法列表

纵观,让

  • return_type是object / primitive / etc的types。 你想返回(通常void
  • blockName是您正在创build的块的variables名称
  • var_type是types对象/基元/等。 你想通过作为参数(留空白没有参数)
  • varName是给定参数的variables名称

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

块作为variables

可能是最常见的宣言。

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

块作为属性

就像将块声明为variables一样,然而巧妙地不同。

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

作为参数块

请注意,这不同于“块作为参数”。 在这个例子中,你声明了一个需要块参数的方法。

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

块作为参数

请注意,这与“块作为参数”不同。 在这个例子中,你正在调用一个想要使用匿名块的块参数的方法。 如果你已经声明了一个块variables,那么把variables名称作为参数就足够了。

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

匿名块

这在function上是一个匿名块,但是将块分配给variables的语法只是将variables设置为一个匿名块。

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

typedef

这允许你设置一个简短的名字,在块的声明过程中可以像其他类名一样被引用。

 typedef return_type (^blockName)(var_type); 

为了稍后使用blockName而不是标准块声明语法,只需replace。

内联块

这可以说是一个不太有用的块的利用,但可能有其地方。 内联块是实例化后立即调用的匿名块。

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

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

 { //... } 

recursion块

这允许你从自己调用一个块,创build一个可以在callback和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 { // ... } 

一样的function,如果有点奇怪。

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

补遗

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

哦,在斯威夫特…

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

这几乎就像是一种语言function。

我个人喜欢使用这个网站( http://fuckingblocksyntax.com )。 该名称比块语法本身更容易记住:

http://fuckingblocksyntax.com

如果你不能加载坏词的URL,你可以使用这个镜像: http : //goshdarnblocksyntax.com

fuckingblocksyntax网站

的typedef:

 typedef void (^block)(NSString *arg); 

一致:

 void (^block)(NSString *) = ^(NSString *param) { // do something.... }; 

方法:

 - (void)method:(void (^)(NSString *param))handler 

Xcode 4片段库包含块types定义和embedded块作为variables的模板。 他们也可以通过自动完成( typedefblockinlineblock )。

作为方法的参数块,我build议声明一个typedef ,然后简单地使用它。 它使代码更容易阅读。

我给一个类写了一个completionBlock,它会在返回骰子的值之后返回:

  1. 使用returnType定义typedef(在@interface声明之上的.h

     typedef void (^CompleteDiceRolling)(NSInteger diceValue); 
  2. 为块( .h )定义@property

     @property (copy, nonatomic) CompleteDiceRolling completeDiceRolling; 
  3. finishBlock.h )定义一个方法

     - (void)getDiceValueAfterSpin:(void (^)(NSInteger diceValue))finishBlock; 
  4. 将以前定义的方法插入到.m文件中, @property finishBlock提交给之前定义的finishBlock

     - (void)getDiceValueAfterSpin:(void (^)(NSInteger diceValue))finishBlock{ self.completeDiceRolling = finishBlock; } 
  5. 触发completionBlock将预定义的variableType传递给它(不要忘记检查completionBlock是否存在)

     if( self.completeDiceRolling ){ self.completeDiceRolling(self.dieValue); } 
 typedef void (^OkBtnBlock)(id data); typedef void (^CancelBtnBlock)(); @property (nonatomic, strong) OkBtnBlock okBtnBlock; @property (nonatomic, strong) CancelBtnBlock cancelBtnBlock; + (void)foo:(OkBtnBlock)okBtn andCancel:(CancelBtnBlock)btnCancel; 

如果你需要在Xcode 4.2中工作,你也可以@synthesize声明为属性的块,就像你使用非块属性一样。 不要让块语法抛出你。

如果你的块属性是这样的:

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

那么你的@synthesize是这样的:

 @property blockName; 

干杯。