为常用的块类型创建typedef
2018-11-15 本文已影响0人
WhistleCai
每个块具有其“固有类型”(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定义块签名的好处是:如果要某种块增加参数,那么只修改定义签名的那行代码即可。