Objective C中的块语法是出了名的不协调。将块作为参数传递与将块声明为ivars不同,后者与对块进行类型定义不同。
是否有一个完整的块声明语法列表,我可以随时保存以供快速参考?
Objective C中的块语法是出了名的不协调。将块作为参数传递与将块声明为ivars不同,后者与对块进行类型定义不同。
是否有一个完整的块声明语法列表,我可以随时保存以供快速参考?
当前回答
Xcode 4代码段库包含块类型defs和内联块作为变量的模板。它们也可以通过自动补全(typedefblock和inlineblock)来实现。
对于作为方法参数的块,我建议声明一个类型定义,然后简单地使用它。它使代码更容易阅读。
其他回答
我个人喜欢使用这个网站(http://fuckingblocksyntax.com)。这个名字比块语法本身更容易记住:
http://fuckingblocksyntax.com
如果你不能加载含有脏话的url,你可以使用这个镜像:http://goshdarnblocksyntax.com
类型:
typedef void (^block)(NSString *arg);
内联:
void (^block)(NSString *) = ^(NSString *param) {
// do something....
};
方法:
- (void)method:(void (^)(NSString *param))handler
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;
我为一个类写了一个completionBlock,它将返回一个骰子被摇后的值:
Define typedef with returnType (.h above @interface declaration) typedef void (^CompleteDiceRolling)(NSInteger diceValue); Define a @property for the block (.h) @property (copy, nonatomic) CompleteDiceRolling completeDiceRolling; Define a method with finishBlock (.h) - (void)getDiceValueAfterSpin:(void (^)(NSInteger diceValue))finishBlock; Insert previous defined method in .m file and commit finishBlock to @property defined before - (void)getDiceValueAfterSpin:(void (^)(NSInteger diceValue))finishBlock{ self.completeDiceRolling = finishBlock; } To trigger completionBlock pass predefined variableType to it (Don't forget to check whether the completionBlock exists) if( self.completeDiceRolling ){ self.completeDiceRolling(self.dieValue); }
Xcode 4代码段库包含块类型defs和内联块作为变量的模板。它们也可以通过自动补全(typedefblock和inlineblock)来实现。
对于作为方法参数的块,我建议声明一个类型定义,然后简单地使用它。它使代码更容易阅读。