给定nil参数时该做什么的Objective-c约定?

时间:2013-09-07 19:50:46

标签: objective-c conventions

在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块进行投影会导致某种失败,或某种默认结果?

我个人的偏好是快速失败,但我认为客观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);
    ...

2 个答案:

答案 0 :(得分:3)

一般来说,如果你的方法要求参数不是nil,那么你最好尽快摆脱困境。

考虑到这一点

NSParameterAssert(item)

是一个很好的做法。它已被彻底解释here,但快速摘要是它会在不满足断言的情况下抛出NSInternalInconsistencyException

请注意,默认情况下,NSParameterAssert宏(以及所有其他NSAssert - 就像宏一样)会在发布版本中删除,除非您取消定义NS_BLOCK_ASSERTIONS

有关此主题的更多信息,请参阅here

答案 1 :(得分:0)

由于projection是一个块,而不是一个对象,所以你不能忽略检查它是否为零;你必须做检查并根据需要做出反应。如果那个反应意味着抛出异常,返回零或其他东西,那取决于你。