第38条:为常用的块类型创建typedef

每个块都具备其“固有类型”,因而可将其赋给适当类型的变量。这个类型由块所接受的参数及其返回值组成。

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。

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