为常用的块类型创建typedef

每个块具有其“固有类型”(inherent type),即它们可以赋值到恰当类型的变量。这个类型由输入参数和返回类型组成。

我们可以为常用的块类型起个别名。为了隐藏复杂的块类型,需要用到C语言中的“类型定义”(type definitions)的语言特性,即使用typedef关键字来定义一个易读的别名,如下:

typedef return_type (^block_name)(parameters);

block_name var = ^(parameters){...};

最好与使用块类型的类一起来定义这些typedef,而且命名别名时还应该把这个类的名字作为前缀,这样可以阐明块的用途。还可以用typedef为同一个块签名类型创建多个别名。

以typedef重新定义block类型,可以令block变量使用起来更简单。
定义新类型时,应遵从现有命名习惯,勿使其名称与别的类型相冲突。
不妨为同一个block签名类型定义多个别名。即使要重构的代码使用了block签名类型的某一别名,也只需修改相应typedef中的block签名即可,无需改动其他的别名。

如果我们需要重复创建某种块(相同参数,返回值)的变量,我们就可以通过typedef来给某一种块定义属于它自己的新类型

例如:

int (^variableName)(BOOL flag, int value) =^(BOOL flag, int value){
     // Implementation
     return someInt;
}

这个块有一个bool参数和一个int参数,并返回int类型。我们可以给它定义类型:

typedef int(^EOCSomeBlock)(BOOL flag, int value);

再次定义的时候,就可以通过简单的赋值来实现:

EOCSomeBlock block = ^(BOOL flag, int value){
     // Implementation
};

定义作为参数的块:

- (void)startWithCompletionHandler: (void(^)(NSData *data, NSError *error))completion;

这里的块有一个NSData参数,一个NSError参数并没有返回值

typedef void(^EOCCompletionHandler)(NSData *data, NSError *error);
- (void)startWithCompletionHandler:(EOCCompletionHandler)completion;”

通过typedef定义块签名的好处是:如果要某种块增加参数,那么只修改定义签名的那行代码即可。

你可能感兴趣的:(为常用的块类型创建typedef)