objective-c에서 nil은 즉각적인 오류를 일으키는 것과는 반대로 전파를 정렬해야합니다. nil (본질적으로)에 메시지를 보내면 항상 nil이됩니다. 아무런 의미가 없는데도 nil 인수를 보낼 때 비슷한 기대가 있습니까?Objective-C 규칙에 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의 블록을 통과해야 하는가?
내 개인적인 취향은 fail-fast이지만, 많은 부분에서 fail-do-nothing을 선호하는 objective-C를 볼 수 있습니다. 나는이 종류의 사건에서 예상되는 국제 대회가 무엇인지에 대한 의견을 환영 할 것이다.
편집
구체적으로는 허용이하는 것입니다 : 당신의 방법 이 매개 변수가 nil이 아니라고이 필요한 경우
일반적으로#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);
...
일반적으로 'nil'이 의미있는 입력이 아닌 경우 (즉, 메소드 인수는 선택 사항이 아니지만 필수이거나 항상 유효한 객체 여야합니다.) 그러면 Cocoa 클래스가 일반적으로하는 일은 1입니다. 오류 검사를 무시하고 segfault가'nil'을 건네 받았을 때 2. NSInvalidArgumentException을 던졌습니다. –
나는 segfault에 의지 할 것이다. 결과 crashtrace는 잡히지 않는 예외보다 훨씬 유용합니다. – bbum