每个块都具备其“固有类型”,因而可将其赋给适当类型的变量。这个类型由块所接受的参数及其返回值组成。
int (^variableName) (BOOL flag, int value) = ^(BOOL flag, int value) {
return value + 1;
};
块类型语法:
return_type (^block_name) (parameters)
为隐藏复杂的块类型,用C语言中“类型定义”的特性,typedef关键字给类型起个易读的别名。
typedef int (^EOCSomeBlock) (BOOL flag, int value);
上面是向系统中新增一个名为EOCSomeBlock的类型。
// 使用新类型
EOCSomeBlock block = ^(BOOL flag, int value) {
return value + 1;
};
使用块的API:
- (void)startWithCompletionHandler:(void (^)(NSData *data, NSError *error))completion;
使用typedef修改后:
typedef void(^EOCCompletionHandler)(NSData *data, NSError *error);
- (void)startWithCompletionHandler:(EOCCompletionHandler)completion;
好处:重构块的类型签名是会很方便。修改后,凡是使用了这个类型定义的地方,都会无法编译,报同一种错误,不会导致修改造成的遗漏。
使用typedef定义新类型时应遵从现有的命名习惯,无使其名称与别的类型相冲突。
块的签名相同,用途不同,不妨为同一个块签名定义多个类型别名。如果要重构的代码使用了块类型的某个别名,那么只需修改相应typedef中的块签名即可,无须改动其他typedef。
网友评论