在 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/