在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);
...
答案 0 :(得分:3)
一般来说,如果你的方法要求参数不是nil,那么你最好尽快摆脱困境。
考虑到这一点
NSParameterAssert(item)
是一个很好的做法。它已被彻底解释here,但快速摘要是它会在不满足断言的情况下抛出NSInternalInconsistencyException
。
请注意,默认情况下,NSParameterAssert
宏(以及所有其他NSAssert
- 就像宏一样)会在发布版本中删除,除非您取消定义NS_BLOCK_ASSERTIONS
。
有关此主题的更多信息,请参阅here。
答案 1 :(得分:0)
由于projection
是一个块,而不是一个对象,所以你不能忽略检查它是否为零;你必须做检查并根据需要做出反应。如果那个反应意味着抛出异常,返回零或其他东西,那取决于你。