Objective-C Language
Enums
Sök…
Syntax
- typedef NS_ENUM (typ, namn) {...} - typ är typen av uppräkning och namn är namnet på enum. värdena finns i "...". Detta skapar en grundläggande enum och en typ att följa med; program som Xcode kommer att anta en variabel med enumtypen har ett av enumvärdena
Definiera enum
Enum definieras av följande syntax ovan.
typedef NS_ENUM(NSUInteger, MyEnum) {
MyEnumValueA,
MyEnumValueB,
MyEnumValueC,
};
Du kan också ställa in dina egna råvärden till uppräkningstyperna.
typedef NS_ENUM(NSUInteger, MyEnum) {
MyEnumValueA = 0,
MyEnumValueB = 5,
MyEnumValueC = 10,
};
Du kan också ange på det första värdet och alla följande kommer att använda det med steg:
typedef NS_ENUM(NSUInteger, MyEnum) {
MyEnumValueA = 0,
MyEnumValueB,
MyEnumValueC,
};
Variabler av detta enum kan skapas av MyEnum enumVar = MyEnumValueA
.
typedef enum-deklaration i mål-C
En enum deklarerar en uppsättning beställda värden - typedef lägger bara till ett praktiskt namn till detta. Det första elementet är 0 etc.
typedef enum {
Monday=1,
Tuesday,
Wednesday
} WORKDAYS;
WORKDAYS today = Monday;//value 1
Konvertera C ++ std :: vektor till ett mål-C-array
Många C ++ -bibliotek använder enums och returnerar / tar emot data med hjälp av vektorer som innehåller enums. Eftersom C-enum inte är Objekt-C-objekt, kan Objekt-C-samlingar inte användas direkt med C-enum. Exemplet nedan behandlar detta genom att använda en kombination av en NSArray och generik och ett omslagobjekt för matrisen. På detta sätt kan samlingen vara tydlig om datatypen och det finns ingen oro för eventuella minnesläckor med C-arrayer Objekt-C-objekt används.
Här är C enum & Objekt-C ekvivalenta objekt:
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
Och här är en möjlig användning av den i Objekt-C ++ (den resulterande NSArray kan endast användas i Objekt-C-filer eftersom ingen C ++ används).
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;
}
Om den här typen av lösningar ska användas på flera enums kan skapandet av EnumObj (deklaration och implementering) göras med ett makro (för att skapa en mallliknande lösning).