2012-11-20 9 views
5

Jeśli zadeklaruję typ wyliczeniowy z nowym makrem NS_ENUM, który został wprowadzony z powodu silniejszego sprawdzenia typu, czy mogę sprawdzić ten typ również w środowisku wykonawczym?Nowe, nowoczesne sprawdzanie typu enum Objective-C

Znaczy, mam

typedef NS_ENUM(NSUInteger, MyNewType) { 

    MyNewTypeInstance1, 
    MyNewTypeInstance2, 
    MyNewTypeInstance3 

}; 

. I chcę wiedzieć, że na przykład (NSUInteger)i = 2 jest rodzaju MyNewType.

+0

co z kompilacji, anyone? – Jonny

Odpowiedz

7

Nr NS_ENUM to tylko sposób użycia funkcji wprowadzonej do Objective-C przez C++ 11 o nazwie "naprawiono podstawowe typy" do wyliczeń. Zapewnia to, że typ używany do przechowywania wyliczonych wartości ma stały rozmiar i sygnaturę, ale nie pozwala na zapytanie o typ wyliczeniowy w czasie wykonywania.

Jeśli interesuje Cię sprawdzenie, czy wartości są rzeczywiście członkami twojego wyliczenia, istnieją dwa powiązane podejścia do tego. Jeśli wartości są ciągłe, można napisać makro, które sprawdza, czy dana wartość znajduje się w ważnym, ciągłym zakresie. W przeciwnym razie można przyjąć bardziej ogólne (i szczegółowe) podejście, które podejmuje firma Apple, np. UIDeviceOrientationIsValidInterfaceOrientation i jawnie sprawdź wszystkie poprawne wyliczone wartości.

+0

Dzięki za podejście UInterfaceOrientationIsValidOrientation! – user500

+1

Nie można znaleźć "UIInterfaceOrientationIsValidOrientation" w żadnej nowej dokumentacji. – Jonny

+0

@ Jonny, ja też nie. Okazuje się, że to złe imię od samego początku. Skorygowano powyżej. – warrenm

0

@warrenm: dobry ansewr

myślałem o tym:

co o dodanie rodzaju "myLastValueJustToCheck" i sprawdzić, czy int jest < że wartość?

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

następnie sprawdzić:

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

To podejście jest w porządku, dopóki nie zostaną jawnie przypisane wartości wyliczenia, np .: 'MyNewTypeInstance3 = 5,'. W takim przypadku wartości mniejsze niż 'myLastValueJustToCheck' nie muszą być poprawne. –

+1

To by zepsuło instrukcje przełączników, sprawdzanie poprawności itp. Trochę. – jrturton

+0

@ Benedict Cohen: tak, oczywiście masz rację. prawdopodobnie powinienem to ostrzec – meronix

Powiązane problemy