2

在 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);
    ...
4

2 回答 2

3

一般来说,如果你的方法要求参数不为nil,最好尽快退出,以防万一。

考虑到这一点

NSParameterAssert(item)

是一个很好的做法。在这里进行了彻底的解释,但快速总结是,NSInternalInconsistencyException如果断言不满足,它会抛出一个。

请注意,默认情况下,NSParameterAssert宏(以及所有其他类似NSAssert宏)在发布版本中被删除,除非您取消定义NS_BLOCK_ASSERTIONS.

更多关于这个主题的解释在这里

于 2013-09-07T19:53:00.970 回答
0

因为projection是一个块,而不是一个对象,所以你不能忽略检查它是否为 nil;您必须进行检查并根据需要做出反应。如果该反应意味着抛出异常、返回 nil 或其他内容,则由您决定。

于 2013-09-07T19:57:34.700 回答