Objective-c 约定当给定 nil 参数时该怎么做?

标签 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 block 进行投影是否会导致某种失败或某种默认结果?

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

最佳答案

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

考虑到这一点

NSParameterAssert(item)

是一个很好的做法。解释得很透here ,但简单的总结是,如果不满足断言,它会抛出 NSInternalInconsistencyException

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

有关该主题的更多解释here .

关于Objective-c 约定当给定 nil 参数时该怎么做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18677273/

相关文章:

ios - 将新单元格插入 UICollectionView

ios - 在分割 View Controller 中主视图 Controller 未显示

java - 将常量放在类中的位置 : standards and best practice

language-agnostic - 当我定义函数时,我应该以什么顺序放置参数?

objective-c - 如何使用NSScrollview?

objective-c - 尝试加载有关方向更改的新 View

ios - 将 Storyboard 中的 UISwipeGuesture 连接到 TableView Controller

clojure - 在 clojure 中将 comp 别名为 º 并将部分别名别名为 Ø

git - Git 提交消息的推荐格式

Python 导入机制