Objective C中的块语法是出了名的不协调。将块作为参数传递与将块声明为ivars不同,后者与对块进行类型定义不同。
是否有一个完整的块声明语法列表,我可以随时保存以供快速参考?
Objective C中的块语法是出了名的不协调。将块作为参数传递与将块声明为ivars不同,后者与对块进行类型定义不同。
是否有一个完整的块声明语法列表,我可以随时保存以供快速参考?
当前回答
类型:
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;
如果你需要回到Xcode 4.2中,你也可以@synthesize一个声明为属性的block,就像你使用非block属性一样。不要让块语法打倒你。
如果你的block属性是:
@property (copy) return_type (^blockName) (var_type);
然后你的@synthesize是这样的:
@property blockName;
欢呼。
Xcode 4代码段库包含块类型defs和内联块作为变量的模板。它们也可以通过自动补全(typedefblock和inlineblock)来实现。
对于作为方法参数的块,我建议声明一个类型定义,然后简单地使用它。它使代码更容易阅读。
类型:
typedef void (^block)(NSString *arg);
内联:
void (^block)(NSString *) = ^(NSString *param) {
// do something....
};
方法:
- (void)method:(void (^)(NSString *param))handler
我个人喜欢使用这个网站(http://fuckingblocksyntax.com)。这个名字比块语法本身更容易记住:
http://fuckingblocksyntax.com
如果你不能加载含有脏话的url,你可以使用这个镜像:http://goshdarnblocksyntax.com