Objective-c 约定,用于在给定 nil 参数时该怎么做



在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 或其他内容,这取决于你。

最新更新