为什么要键入块而不是使用普通块?

时间:2015-07-16 10:45:17

标签: ios objective-c block typedef

在这个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;

}

这样做有什么好处吗?

2 个答案:

答案 0 :(得分:1)

块语法不是Objective-C样式......  使用 typedef 可以让您的代码更好。

它还允许您在许多情况下重用相同的块类型。 (如果您考虑服务器请求块,并且每个请求方法都有与参数相同的响应块,则使用typedef将阻止代码的重用...)

答案 1 :(得分:0)

typedef块背后的整个想法是让ObjC看起来更清洁,更好。如果你有一个像这样的块:

NSMutableAttributedString *(^)(UIFont *, UIColor *, const CGFloat, NSString *)

这被视为一个参数,你会得到一个难以阅读的巨大混乱。如果你typedef它,它变得更好,因为你只传递typedef名称。如果您将其命名为AttributedStringAssemblerBlock,那么理解它也会更加简单。

有块的东西是它们对于ObjC来说相当新,并且没有正确的外观和感觉。 swift中的闭包很好,而且语言更合适。

第二件事是重复,正如评论中所指出的那样。拥有块的通用typedef使它们可以在所有地方重用。