在objective-c中,nil应该传播,而不是立即导致失败。向 nil 发送消息(本质上)总是会导致 nil。当发送 nil 参数时是否有类似的期望,当这毫无意义时?
我想到的特殊情况本质上是函数map
方法:
-(NSArray*) map:(id (^)(id item))projection {
if (projection == nil) {
// ?? what to do ??
// throw exception?
// return nil?
// return empty array?
}
NSMutableArray* r = [NSMutableArray arrayWithCapacity:[self count]];
for (id e in self) {
[r addObject:projection(e)];
}
return r;
}
传递用于投影的 nil 块是否会导致某种故障或某种默认结果?
我个人更喜欢快速失败,但我看到objective-C在很多地方都倾向于失败无所事事。我将不胜感激在这种情况下的预期约定是什么。
编辑
更具体地说,这样做是否可以接受:
#define require(expr)
if (!(expr))
@throw([NSException exceptionWithName:NSInvalidArgumentException
reason:[NSString stringWithFormat:@"!require(%@)", (@#expr)]
userInfo:nil])
-(NSArray*) map:(id (^)(id item))projection {
require(projection != nil);
...
一般来说,如果你的方法要求参数不是 nil,你最好尽快救助,以防万一。
考虑到这一点
NSParameterAssert(item)
是一种很好的做法。这里对此进行了彻底的解释,但快速总结是,如果断言不满意,它会抛出一个NSInternalInconsistencyException
。
请注意,默认情况下,NSParameterAssert
宏(以及所有其他NSAssert
类似宏)将在发布版本中删除,除非您取消定义NS_BLOCK_ASSERTIONS
。
有关该主题的更多信息,请在此处进行说明。
> 由于projection
是一个块,而不是一个对象,你不能只是忽略检查它是否为零;你必须进行检查并根据需要做出反应。如果这种反应意味着抛出异常、返回 nil 或其他内容,这取决于你。