Objective-C Language
Enums
Recherche…
Syntaxe
- typedef NS_ENUM (type, name) {...} - type est le type d'énumération et name est le nom de l'énumération. les valeurs sont dans "...". Cela crée un enum de base et un type pour aller avec; les programmes comme Xcode supposent qu'une variable avec le type enum a l'une des valeurs enum
Définir un enum
Les énumérations sont définies par la syntaxe ci-dessus.
typedef NS_ENUM(NSUInteger, MyEnum) {
MyEnumValueA,
MyEnumValueB,
MyEnumValueC,
};
Vous pouvez également définir vos propres valeurs brutes sur les types d'énumération.
typedef NS_ENUM(NSUInteger, MyEnum) {
MyEnumValueA = 0,
MyEnumValueB = 5,
MyEnumValueC = 10,
};
Vous pouvez également spécifier la première valeur et tous les éléments suivants l'utiliseront avec un incrément:
typedef NS_ENUM(NSUInteger, MyEnum) {
MyEnumValueA = 0,
MyEnumValueB,
MyEnumValueC,
};
Les variables de cette énumération peuvent être créées par MyEnum enumVar = MyEnumValueA
.
Déclaration de typedef enum dans Objective-C
Un enum déclare un ensemble de valeurs ordonnées - le typedef ajoute simplement un nom pratique à ceci. Le 1er élément est 0 etc.
typedef enum {
Monday=1,
Tuesday,
Wednesday
} WORKDAYS;
WORKDAYS today = Monday;//value 1
Conversion de C ++ std :: vector vers un tableau Objective-C
De nombreuses bibliothèques C ++ utilisent des énumérations et renvoient / reçoivent des données à l'aide de vecteurs contenant des énumérations. Comme les énumérations C ne sont pas des objets Objective-C, les collections Objective-C ne peuvent pas être utilisées directement avec les énumérations C. L'exemple ci-dessous traite de cela en utilisant une combinaison de NSArray et de génériques et un objet wrapper pour le tableau. De cette manière, la collection peut être explicite sur le type de données et il n’ya pas de soucis concernant les fuites de mémoire possibles avec les tableaux C Les objets Objective-C sont utilisés.
Voici l'objet équivalent C enum & Objective-C:
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
Et voici une utilisation possible dans Objective-C ++ (le NSArray résultant peut être utilisé dans les fichiers Objective-C uniquement car aucun C ++ n'est utilisé).
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;
}
Si ce type de solution doit être utilisé sur plusieurs énumérations, la création de EnumObj (déclaration et implémentation) peut être effectuée à l'aide d'une macro (pour créer un modèle comme une solution).