2012-11-20 5 views
5

더 강력한 형식 검사로 인해 도입 된 새로운 NS_ENUM 매크로로 열거 형을 선언하면 런타임에서도이 형식을 확인할 수 있습니까? 내 말은새로운 현대적인 Objective-C 열거 형 검사

, 나는

typedef NS_ENUM(NSUInteger, MyNewType) { 

    MyNewTypeInstance1, 
    MyNewTypeInstance2, 
    MyNewTypeInstance3 

}; 

있습니다. 예를 들어 (NSUInteger)i = 2이 종류가 MyNewType 인 것을 알고 싶습니다.

+0

무엇 컴파일 시간에 대한, 사람을? – Jonny

답변

7

번호 NS_ENUM은 열거 형에 "고정 된 기본 유형"이라고하는 C++ 11을 통해 Objective-C에 도입 된 기능을 사용하는 방법 일뿐입니다. 이렇게하면 열거 형 값을 저장하는 데 사용되는 유형의 크기와 부호가 고정되어 있지만 런타임시 열거 형에 대해 질의 할 수는 없습니다.

값이 실제로 열거 형의 구성원인지 확인하는 데 관심이 있다면 관련 두 가지 방법이 있습니다. 값이 연속적이면 문제의 값이 유효한 인접 범위에 있는지 검사하는 매크로를 작성할 수 있습니다. 그렇지 않으면 애플이 취하는보다 일반적인 (그리고 장황한) 접근법을 취할 수있다. UIDeviceOrientationIsValidInterfaceOrientation을 입력하고 모든 유효한 열거 형 값에 대해 명시 적으로 확인하십시오.

+0

UIInterfaceOrientationIsValidOrientation 접근 방식을 제공해 주셔서 감사합니다! – user500

+1

최근 문서에서'UIInterfaceOrientationIsValidOrientation'을 찾을 수 없습니다. – Jonny

+0

@Jonny도 할 수 없었습니다. 그것은 잘못된 이름이었습니다. 위의 수정. – warrenm

0

@warrenm : 좋은 ansewr

내가 이것에 대해 생각했다 :

것 "myLastValueJustToCheck"의 종류를 추가하고 INT는 < 그 값인지 확인에 대해?

typedef NS_ENUM(NSUInteger, MyNewType) { 
    MyNewTypeInstance1, 
    MyNewTypeInstance2, 
    MyNewTypeInstance3, 
    myLastValueJustToCheck 
}; 

다음 확인 :

NSUInteger i = 2; 
NSLog(@"is %i i in my range? %i", i, (i<myLastValueJustToCheck)); 

i = 3; 
NSLog(@"is %i i in my range? %i", i, (i<myLastValueJustToCheck)); 

i = 4; 
NSLog(@"is %i i in my range? %i", i, (i<myLastValueJustToCheck)); 
+1

이 접근법은 열거 형 값이 명시 적으로 할당 될 때까지 유효합니다. E.G .:'MyNewTypeInstance3 = 5,'. 이 경우,'myLastValueJustToCheck'보다 작은 값은 반드시 유효하지는 않습니다. –

+1

스위치 문, 유효성 검사 등을 망칠 것입니다. – jrturton

+0

@ Benedict Cohen : 예, 물론 당신 말이 맞습니다. 아마 나는 그것을 경고해야한다. – meronix