intValue를 원할 때 NSNumber의 포인터를 실수로 사용하는 것을 방지하려면 어떻게 해야 합니까?

StackOverflow https://stackoverflow.com/questions/1898091

문제

제가 정말 좋아하는 Java 기능 중 하나는 컴파일러가 기본 형식과 해당 래퍼 클래스 간에 자동으로 변환하는 자동박싱입니다.

저는 Objective-C/Cocoa로 Core Data 애플리케이션을 작성하고 있는데 정수 속성을 프로그래밍 방식으로 처리하는 것이 답답합니다.이유는 다음과 같습니다.

//img is a managed object that I have fetched

NSString* filename = [NSString stringWithFormat:@"image%d.png", [[img valueForKey:@"imageID"] intValue]];  

만약 내가 그 일을 잊어버리면 intValue 내가 가끔 하는 메시지와 전달되는 int stringWithFormat: 실제로 포인터 값입니다.

문제는 이것이 컴파일러 오류나 경고 없이 완전히 자동으로 발생한다는 것입니다.때때로 나는 이 어리석고 어리석은 일이 문제일 때 디버깅에 너무 오랜 시간을 소비할 것입니다.

그 함정에 빠지지 않도록 프로그래밍 스타일이나 컴파일러 설정을 변경할 수 있는 방법이 있습니까?

편집하다:위의 예가 내가 문제에 부딪히는 많은 장소 중 하나일 뿐이라는 사실이 명확하지 않았습니다.다음은 문자열과 관련이 없는 또 다른 가상의 예입니다.

실재 CollegeClass 두 가지 정수 속성이 있습니다. courseNumber 그리고 enrollmentLimit.강좌 번호를 비교하고 싶다고 가정해 보겠습니다.

//classFoo is a NSManagedObjects I've fetched
if ([[classFoo valueForKey@"courseNumber"] intValue] < 400) {
    NSLog(@"undergraduate class");
}

또는 마찬가지로 CS 부서의 모든 수업에 대한 평균 등록 한도를 계산한다고 가정해 보겠습니다.

도움이 되었습니까?

해결책

… CS 부서의 모든 클래스에 대한 평균 등록 한도를 계산하고 싶다고 가정하십시오.

이것은 쉽게 할 수 있습니다 NSARRAY와 NSSET 's @avg 운영자. 물론, 그것은 nsnumber를 반환하여 문제 #2로 돌아갑니다.

코스 번호를 비교하고 싶다고 가정 해 봅시다.

//classFoo is a NSManagedObjects I've fetched
if ([[classFoo valueForKey@"courseNumber"] intValue] < 400) {
    NSLog(@"undergraduate class");
}

나는 당신이 위험에 처한 문제가 intValue NSNUMBER 객체를 비교하여 메시지 id ~로 int.

컴파일러는 이러한 비교에 대한 경고를 제공합니다. Xcode에서 추가하십시오 -Wextra "기타 C 플래그"빌드 설정에. 더 많은 경고 옵션은 참조하십시오 GCC 경고의 전체 목록.

다른 팁

%@를 사용하여 nsnumber를 %d 대신 문자열로 직접 변환 할 수 있습니다.

실제로 nsobject 기반 클래스를 가져 와서 내가 믿는 문자열로 변환합니다.

이것은 핵심 데이터를 처리 할 때만 적용되지만 사용하는 경우 Mogenerator 핵심 데이터 객체에 대한 클래스를 생성하려면 (어쨌든하는 것이 좋습니다) -[propertyName]Value 반환하는 속성에 대한 올바른 값에 직접 액세스하는 방법 NSNumber에스:

// These two methods are identical when called on a class 
// which was generated with MOGenerator
[[object imageID] intValue];
[object imageIDValue];

"Typecheck 호출을 켭니다. printf/scanf” 경고, 아직 켜져 있지 않은 경우.이것은 그렇지 않습니다 현재 NS/CFString 형식 지정에 도움이 되지만 이에 대한 레이더 개선 요청(x-radar://problem/7375186)을 제출했습니다.물론 직접 제출하셔도 좋습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top