Objective-C Language
Aufzählungen
Suche…
Syntax
- typedef NS_ENUM (type, name) {...} - type ist der Aufzählungstyp und name ist der Name der Enumeration. Werte sind in "...". Dadurch wird eine grundlegende Aufzählung und ein dazugehöriger Typ erstellt. Programme wie Xcode gehen davon aus, dass eine Variable mit dem Aufzählungstyp einen der Aufzählungswerte hat
Eine Aufzählung definieren
Aufzählungen werden durch die folgende obige Syntax definiert.
typedef NS_ENUM(NSUInteger, MyEnum) {
MyEnumValueA,
MyEnumValueB,
MyEnumValueC,
};
Sie können auch Ihre eigenen Rohwerte für die Aufzählungstypen festlegen.
typedef NS_ENUM(NSUInteger, MyEnum) {
MyEnumValueA = 0,
MyEnumValueB = 5,
MyEnumValueC = 10,
};
Sie können auch den ersten Wert angeben und alle folgenden Werte werden mit Inkrementierung verwendet:
typedef NS_ENUM(NSUInteger, MyEnum) {
MyEnumValueA = 0,
MyEnumValueB,
MyEnumValueC,
};
Variablen dieser Enumeration können mit MyEnum enumVar = MyEnumValueA
.
Typedef-Enumendeklaration in Objective-C
Eine Aufzählung deklariert einen Satz von geordneten Werten - der Typedef fügt diesem nur einen praktischen Namen hinzu. Das 1. Element ist 0 usw.
typedef enum {
Monday=1,
Tuesday,
Wednesday
} WORKDAYS;
WORKDAYS today = Monday;//value 1
Konvertierung von C ++ std :: vector zu einem Objective-C-Array
Viele C ++ - Bibliotheken verwenden Enumerationen und geben / empfangen Daten unter Verwendung von Vektoren, die Enumerationen enthalten. Da C-Enums keine Objective-C-Objekte sind, können Objective-C-Sammlungen nicht direkt mit C-Enums verwendet werden. Das folgende Beispiel behandelt dies, indem eine Kombination aus NSArray und Generics sowie ein Wrapper-Objekt für das Array verwendet wird. Auf diese Weise kann die Erfassung des Datentyps explizit sein, und es gibt keine Bedenken hinsichtlich möglicher Speicherverluste bei C-Arrays, die Objective-C-Objekte verwendet werden.
Hier ist das Objekt C enum & Objective-C äquivalent:
typedef enum
{
Error0 = 0,
Error1 = 1,
Error2 = 2
} MyError;
@interface ErrorEnumObj : NSObject
@property (nonatomic) int intValue;
+ (instancetype) objWithEnum:(MyError) myError;
- (MyError) getEnumValue;
@end
@implementation ErrorEnumObj
+ (instancetype) objWithEnum:(MyError) error
{
ErrorEnumObj * obj = [ErrorEnumObj new];
obj.intValue = (int)error;
return obj;
}
- (MyError) getEnumValue
{
return (MyError)self.intValue;
}
@end
Und hier ist eine mögliche Verwendung davon in Objective-C ++ (der resultierende NSArray kann nur in Objective-C-Dateien verwendet werden, da kein C ++ verwendet wird).
class ListenerImpl : public Listener
{
public:
ListenerImpl(Listener* listener) : _listener(listener) {}
void onError(std::vector<MyError> errors) override
{
NSMutableArray<ErrorEnumObj *> * array = [NSMutableArray<ErrorEnumObj *> new];
for (auto&& myError : errors)
{
[array addObject:[ErrorEnumObj objWithEnum:myError]];
}
[_listener onError:array];
}
private:
__weak Listener* _listener;
}
Wenn diese Art von Lösung in mehreren Enummen verwendet werden soll, kann die Erstellung der EnumObj (Deklaration und Implementierung) mithilfe eines Makros erfolgen (um eine Vorlage wie die Lösung zu erstellen).