流亡者是一个简单的库,为Objective-C添加了as
语言构造。
NSObject* obj = /* get an object */;
obj.as(^(id<Drawable> drawable) {
[drawable draw];
});
在不使用流亡者的情况下,通常的做法是
NSObject* obj = /* get an object */;
if ([obj conformsToProtocol:@protocol(Drawable)]) {
[(id<Drawable>)obj draw];
}
这很啰嗦,重复,并且编译器也没有检查您是否将转换为相同的协议进行检查。
流亡者使您能够轻松编写简洁且声明性的安全代码。
流亡者还包括一个match
构造,用于编写适用于多个情况的安全类型依赖代码。
id result = /* get a result */;
result.match(@[
^(NSArray* manyThings) {
for (id thing in manyThings) { /* ... */ }
},
^(NSString* str) {
NSLog(@"The string: %@", str);
},
^(UIView* view) {
[view removeFromSuperview];
},
^(id somethingElse) {
NSLog(@"wasn't expecting: %@", somethingElse);
}
]);
match
构造返回匹配的执行的代码块的结果。
NSString* description = obj.match(@[
^(NSArray* manyThings) {
return [NSString stringWithFormat:@"%d things", manyThings.count];
},
^(NSString* str) {
return @"one string";
},
^(id somethingElse) {
return @"one random thing";
}
]);
如果obj
是一个包含3个元素的NSArray
,则description
是"3 things"
。如果obj
是一个字符串,则是"one string"
。否则是"one random thing"
。
然后,您只需要导入流亡者头文件
#import <castaway/castaway.h>
id
类型上调用as
在上面的例子中,我们使用了带有点符号的as
和match
。您不能在id
类型的变量上使用属性符号,因此应使用as
和match
的消息版本。
id obj = /* get an object */;
[obj as:^(id<Drawable> drawable) {
[drawable draw];
}];
Dustin Bachrach,[email protected]
特别感谢PromiseKit的Max Howell,感谢NSMethodSignatureForBlock。
流亡者可在MIT许可证下使用。有关更多信息,请参阅LICENSE文件。