7

는 왜이 작품 않습니다switch 문에 NSInteger를 사용할 수없는 이유는 무엇입니까?

error: case label does not reduce to an integer constant

이 NSInteger의는 다음과 같이 사용할 수 없습니다 :

NSInteger sectionLocation = 0; 
NSInteger sectionTitles = 1; 
NSInteger sectionNotifications = 2; 

switch (section) { 
    case sectionLocation: 
     // 
     break; 
    case sectionTitles: 
     // 
     break; 
    case sectionNotifications: 
     // 
     break; 
    default: 
     // 
} 

나는이 컴파일 오류가? 그렇다면 switch 문에서 변수를 사례로 사용하는 다른 방법이 있습니까? sectionLocation 등은 가변 값을 갖는다.

답변

10

문제는 스칼라 유형이 아니지만 사례 레이블은 변수와 같은 값을 변경할 수 있습니다.

모든 목적과 목적을 위해 컴파일러는 switch 문을 gotos 집합으로 컴파일합니다. 레이블은 가변적 일 수 없습니다.

열거 형 또는 #defines를 사용하십시오.

2

여기서 문제는 변수를 사용하는 것입니다. switch 문에는 상수 만 사용할 수 있습니다.

#define SOME_VALUE 1 

또는

enum Values { 
    valuea = 1, 
    valueb = 2, 
    ... 
} 

같은 무언가를 그리고 당신은 당신의 switch 문에 등 valuea 등을 사용할 수 있습니다.

+0

그래서 난 경우 - 다른-경우 - 다른 다시에 의지해야합니까? 이 문제를 해결할 방법이 없을까요? – Rits

+0

예, 정의를 사용하면 문제가 무엇입니까? :디 – fresskoma

4

이유는 컴파일러가 스위치 값을 테이블의 키로 사용하여 종종 '점프 테이블'을 만들고 싶을 뿐이며 간단한 정수 값으로 전환하는 경우에만 수행 할 수 있기 때문입니다. 대신 작동해야합니다 :

#define sectionLocation 0 
#define sectionTitles 1 
#define sectionNotifications 2 

int intSection = section; 

switch (intSection) { 
    case sectionLocation: 
     // 
     break; 
    case sectionTitles: 
     // 
     break; 
    case sectionNotifications: 
     // 
     break; 
    default: 
     // 
} 
1

케이스 값이 실제로 런타임에 변경되면 if ... else if ... else if construct if there.

-2

하거나이

switch((int)secion) 
관련 문제