2013-09-07 4 views
2

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); 
    ... 
+0

일반적으로 'nil'이 의미있는 입력이 아닌 경우 (즉, 메소드 인수는 선택 사항이 아니지만 필수이거나 항상 유효한 객체 여야합니다.) 그러면 Cocoa 클래스가 일반적으로하는 일은 1입니다. 오류 검사를 무시하고 segfault가'nil'을 건네 받았을 때 2. NSInvalidArgumentException을 던졌습니다. –

+0

나는 segfault에 의지 할 것이다. 결과 crashtrace는 잡히지 않는 예외보다 훨씬 유용합니다. – bbum

답변

3

말하기, 당신은 더 나은 구제 것을 그것이 가능한 한 빨리. 마음

NSParameterAssert(item) 

에두고

는 것이 좋습니다. here을 철저히 설명하지만 어설 션이 만족스럽지 않을 경우를 대비하여 빠른 요약은 NSInternalInconsistencyException을 던집니다.

NS_BLOCK_ASSERTIONS의 정의를 해제하지 않는 한 기본적으로 NSParameterAssert 매크로 (모든 다른 매크로는 NSAssert- 같은 매크로)는 릴리스 빌드에서 제거된다는 점에 유의하십시오.

자세한 내용은 here으로 설명되어 있습니다.

0

projection은 객체가 아니라 블록이므로 무시할 수 없습니다. 당신은 수표를하고 필요에 따라 반응해야합니다. 그 반응이 예외를 던지거나, 무언가를 돌려주는 것을 의미한다면 그것은 당신에게 달려 있습니다.

+0

하지만 그게 문제입니다. 더 나은 반응은 무엇입니까? 예외를 던지거나,'nil' 또는 다른 것을 반환하십시오. – rmaddy

+0

여기에 어떤 "더 나은 반응"이 실제로 존재하지 않습니다. 그것은 당신이 일을 어떻게하고 싶은지에 있습니다 ... 코드를 추가하는 환경에 가장 적합한 것은 무엇입니까. – mah