2012-11-20 15 views
5

Wenn ich den Enum-Typ mit dem neuen Makro NS_ENUM deklariere, das wegen der stärkeren Typprüfung eingeführt wurde, kann ich diesen Typ auch in der Laufzeit prüfen?Neuer moderner Objective-C-Enum-Typ-Check

ich meine, ich habe

typedef NS_ENUM(NSUInteger, MyNewType) { 

    MyNewTypeInstance1, 
    MyNewTypeInstance2, 
    MyNewTypeInstance3 

}; 

. Und ich möchte wissen, dass zum Beispiel (NSUInteger)i = 2 ist eine Art MyNewType.

+0

Was ist der Kompilierung, anyone? – Jonny

Antwort

7

Nr. NS_ENUM ist nur eine Möglichkeit, ein Feature zu verwenden, das in Objective-C über C++ 11 eingeführt wurde, das als "feste zugrunde liegende Typen" für Aufzählungen bezeichnet wird. Dies stellt sicher, dass der Typ, der zum Speichern der Aufzählungswerte verwendet wird, eine feste Größe und Signedness aufweist. Sie können jedoch nicht zur Laufzeit nach dem Aufzählungstyp fragen.

Wenn Sie überprüfen möchten, ob Werte tatsächlich Mitglieder Ihrer Aufzählung sind, gibt es zwei verwandte Ansätze dafür. Wenn die Werte zusammenhängend sind, können Sie ein Makro schreiben, das überprüft, ob der betreffende Wert im gültigen zusammenhängenden Bereich liegt. Andernfalls können Sie den allgemeineren (und ausführlicheren) Ansatz verwenden, mit dem Apple z. UIDeviceOrientationIsValidInterfaceOrientation, und überprüfen Sie explizit alle gültigen aufgezählten Werte.

+0

Danke für diesen UIInterfaceOrientationIsValidOrientation-Ansatz! – user500

+1

"UIInterfaceOrientationIsValidOrientation" kann in keiner aktuellen Dokumentation gefunden werden. – Jonny

+0

@Jonny, konnte ich auch nicht. Es stellte sich heraus, dass das immer der falsche Name war. Korrigiert oben. – warrenm

0

@warrenm: gut ansewr

ich darüber dachte:

was eine Art "myLastValueJustToCheck" hinzufügen und überprüfen, ob Ihr int ist < dieser Wert?

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

dann überprüfen:

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

Dieser Ansatz ist in Ordnung, bis die Enum-Werte explizit zugewiesen sind, E.G .: 'MyNewTypeInstance3 = 5,'. Wenn dies passiert, sind Werte, die kleiner als 'myLastValueJustToCheck' sind, nicht unbedingt gültig. –

+1

Das würde Switch-Anweisungen, Validierung usw. ziemlich durcheinander bringen. – jrturton

+0

@ Benedict Cohen: ja, natürlich hast du recht. wahrscheinlich sollte ich es warnen – meronix