众所周知,Objective C(甚至我认为确实是C)中的块语法是不一致的。将块作为参数传递看起来与将块声明为ivars不同,后者看起来与typedef
ing块不同。
是否有可供我快速参考的块声明语法的完整列表?
众所周知,Objective C(甚至我认为确实是C)中的块语法是不一致的。将块作为参数传递看起来与将块声明为ivars不同,后者看起来与typedef
ing块不同。
是否有可供我快速参考的块声明语法的完整列表?
Answers:
在整个过程中,让
return_type
是对象/原始/等的类型。您想返回(通常是void
)blockName
是您要创建的块的变量名var_type
是类型object / primitive / etc。您想作为参数传递(不带任何参数保留空白)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)
这几乎就像是一种语言功能。
BlockType ^blockVar = Anonymous Block
显示语法错误,也没有^ :(
我个人喜欢使用此网站(http://fuckingblocksyntax.com)。该名称比块语法本身更容易记住:
如果您无法加载URL中包含错误单词的URL,则可以使用此镜像:http : //goshdarnblocksyntax.com
Typedef:
typedef void (^block)(NSString *arg);
排队:
void (^block)(NSString *) = ^(NSString *param) {
// do something....
};
方法:
- (void)method:(void (^)(NSString *param))handler
我为一个类编写了一个completeBlock,该类将在摇动后返回骰子的值:
用returnType定义typedef(.h
上面的@interface
声明)
typedef void (^CompleteDiceRolling)(NSInteger diceValue);
@property
为块定义一个(.h
)
@property (copy, nonatomic) CompleteDiceRolling completeDiceRolling;
用finishBlock
(.h
)定义方法
- (void)getDiceValueAfterSpin:(void (^)(NSInteger diceValue))finishBlock;
插入先前定义的方法.m
文件并提交finishBlock
给@property
之前定义
- (void)getDiceValueAfterSpin:(void (^)(NSInteger diceValue))finishBlock{
self.completeDiceRolling = finishBlock;
}
触发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;
干杯。
@property blockName
没有用。我认为应该是@synthesize blockName;
?(用于合成块)