2012-07-28 4 views
0

이것은 가장 간단한 것이지만 정확한 원인을 찾을 수 없습니다. 대신 다음과 같은 말로 설명하는 것은 내 코드입니다 :NSString이 NULL 인 경우 NSInteger가 0을 반환합니다.

NSString *str = @""; 
NSInteger tempInteger = [str integerValue]; 

if (tempInteger == 0) 
{ 
    NSLog (@"do something"); 
} 

NSInteger는 0을 반환하고 NSString 일부 값이있는 경우 다음 NSInteger 같은 값을 반환 한 후 NULL을 반환 NSString합니다.

그러나 NSStringNULL 때 그때 NULL하지 0을 반환해야 NSInteger를 원하지만 내가 NULLNSInteger을 유효성 검사 할 수 없습니다입니다.

NSString이 NULL이면 값을 NSInteger에 어떻게 얻을 수 있습니까?

+0

'id number = str? [NSNumber numberWithInteger : [str integerValue]] : [NSNull null]; ' – Joe

답변

10

NULL은 포인터입니다. NSInteger는 숫자 만 저장할 수있는 C 기본 형식입니다. NSInteger가 NULL 일 수는 없습니다. ((!) 참고가 :. 우리가 목표 - C 객체 포인터의 말할 때, 우리는 nil보다는 NULL 사용)이 정수 값이 0 인 경우에만 경우를 처리하고자하지만, 경우

대신 문자열 NULL은 아니다, 다음과 같이 당신은 당신의 상태를 변경해야합니다 :

if (tempInteger == 0 && str != nil) 

그러나, 귀하의 경우, 문자열 nil은 아니다; 그것은 단지 존재하지만 - 빈 문자열이다. 당신은 또한 확인하고자하는 경우, 당신의 상태가 될 수하십시오 nil 문자열 길이 0를 반환하기 때문에

if (tempInteger == 0 && [str length] > 0) 

모두가지 경우를 확인합니다. (실제로, 임의의 방법이 반환 타입에 따라 0, nil, 0.0를 반환 nil 전송).

+1

문자열을 정수로 변환 할 수없는 경우 (예 : @ "hi")'NSInteger '도 0이됩니다. – Alladinian

1

정수는 숫자에 너트 null 값만 저장할 수 있습니다. 이 경우 널 (null)인지 검사 할 문자열의 길이를 먼저 확인해야합니다.

0

NSInteger 스칼라 변수 타입이다. 값 NULL (실제로 ObjectiveC에서 nil)은 주소 0에 대한 포인터를 나타내며 NSInteger로 캐스트 될 때 0이됩니다.

작업을 수행하려면 정수로 변환하기 전에 NSStringnil과 비교해야합니다.

if (str == nil) 
{ 
    //our string is invalid 
} 
else 
{ 
    tempInteger = [str integerValue]; 
} 
2

사실 당신은 이와 같은 논리를 구현할 수 있습니다 : 당신의 캐릭터는 뭔가를 0이 있다면

  • 시도가 그것을
  • 를 변환하는 정수 참으로

    1. 선택하면

    다음과 같은 것이 트릭입니다.

    NSString *str = @""; 
    NSInteger tempInteger = [str integerValue]; 
    NSCharacterSet *cs = [NSCharacterSet decimalDigitCharacterSet]; 
    BOOL safe = [cs isSupersetOfSet:[NSCharacterSet characterSetWithCharactersInString:str]] && str.length > 0; 
    
    if (safe && tempInteger == 0) 
    { 
        NSLog (@"do something"); 
    } 
    
  • 관련 문제