在这个project中,ArrayDataSource
类有一个使用typedef-ing块作为参数的公共方法:
起源就像:
//ArrayDataSource.h
typedef void (^TableViewCellConfigureBlock)(id cell, id item);
- (id)initWithItems:(NSArray *)anItems
cellIdentifier:(NSString *)aCellIdentifier
configureCellBlock:(TableViewCellConfigureBlock)aConfigureCellBlock;
//ArrayDataSource.m
@property (nonatomic, copy) TableViewCellConfigureBlock configureCellBlock;
- (id)initWithItems:(NSArray *)anItems
cellIdentifier:(NSString *)aCellIdentifier
configureCellBlock:(TableViewCellConfigureBlock)aConfigureCellBlock
{
self = [super init];
if (self) {
self.items = anItems;
self.cellIdentifier = aCellIdentifier;
self.configureCellBlock = [aConfigureCellBlock copy];
}
return self;
}
为什么不成功:
//ArrayDataSource.h
//no typedef
- (id)initWithItems:(NSArray *)anItems
cellIdentifier:(NSString *)aCellIdentifier
configureCellBlock:(void(^)(id cell, id item))aConfigureCellBlock;
//ArrayDataSource.m:
@property (nonatomic, copy) void*(^configBlock)(id cell, id item);
- (id)initWithItems:(NSArray *)anItems cellIdentifier:(NSString *)aCellIdentifier configureCellBlock:(void (^)(id, id))aConfigureCellBlock{
self = [super init];
if (self) {
self.items = anItems;
self.cellIdentifier = aCellIdentifier;
self.configBlock = [aConfigureCellBlock copy];
}
return self;
}
这样做有什么好处吗?
答案 0 :(得分:1)
块语法不是Objective-C样式......
使用 typedef
可以让您的代码更好。
它还允许您在许多情况下重用相同的块类型。 (如果您考虑服务器请求块,并且每个请求方法都有与参数相同的响应块,则使用typedef将阻止代码的重用...)
答案 1 :(得分:0)
typedef
块背后的整个想法是让ObjC看起来更清洁,更好。如果你有一个像这样的块:
NSMutableAttributedString *(^)(UIFont *, UIColor *, const CGFloat, NSString *)
这被视为一个参数,你会得到一个难以阅读的巨大混乱。如果你typedef
它,它变得更好,因为你只传递typedef
名称。如果您将其命名为AttributedStringAssemblerBlock
,那么理解它也会更加简单。
有块的东西是它们对于ObjC来说相当新,并且没有正确的外观和感觉。 swift中的闭包很好,而且语言更合适。
第二件事是重复,正如评论中所指出的那样。拥有块的通用typedef使它们可以在所有地方重用。