66 votes

enum Values to NSString (iOS)

J'ai un enum tenant plusieurs valeurs:

enum {valeur1, valeur2, valeur3} maValeur;

À un moment donné de mon application, je souhaite vérifier quelle valeur de l'énum est maintenant active. J'utilise NSLog mais je ne comprends pas bien comment afficher la valeur actuelle de l'énum (valeur1 / valu2 / valu3 / etc ...) en tant que NSString pour le NSLog.

N'importe qui?

88voto

Mark Longmire Points 327

Je n’aimais pas mettre l’enum sur le tas, sans fournir une fonction de tas pour la traduction. Voici ce que je suis venu avec:

 typedef enum {value1, value2, value3} myValue;
#define myValueString(enum) [@[@"value1",@"value2",@"value3"] objectAtIndex:enum]
 

Ceci maintient les déclarations enum et string proches l'une de l'autre pour une mise à jour facile en cas de besoin.

Maintenant, n'importe où dans le code, vous pouvez utiliser l'enum / macro comme ceci:

 myValue aVal = value2;
NSLog(@"The enum value is '%@'.", myValueString(aVal));

outputs: The enum value is 'value2'.
 

Pour garantir les index des éléments, vous pouvez toujours déclarer explicitement les valeurs de début (ou toutes) enum.

 enum {value1=0, value2=1, value3=2};
 

58voto

badMonkey Points 705

Ceci est répondu ici: quelques suggestions sur la mise en œuvre

La ligne du bas est Objective-C utilise un ancien, C enum régulier, qui est juste un ensemble glorifié d’entiers.

Étant donné un enum comme ceci:

 typedef enum { a, b, c } FirstThreeAlpha;
 

Votre méthode ressemblerait à ceci:

 - (NSString*) convertToString:(FirstThreeAlpha) whichAlpha {
    NSString *result = nil;

    switch(whichAlpha) {
        case a:
            result = @"a";
            break;
        case b:
            result = @"b";
            break;
        case c:
            result = @"c";
            break;

        default:
            result = @"unknown";
    }

    return result;
}
 

34voto

Han-Jong Ko Points 129

Je vais vous présenter est la façon dont j'utilise, et il a l'air mieux que la précédente réponse.(Je pense)

Je voudrais illustrer avec UIImageOrientation pour faciliter la compréhension.

typedef enum {
    UIImageOrientationUp,            // default orientation
    UIImageOrientationDown,          // 180 deg rotation
    UIImageOrientationLeft,          // 90 deg CCW
    UIImageOrientationRight,         // 90 deg CW
    UIImageOrientationUpMirrored,    // as above but image mirrored along other axis. horizontal flip
    UIImageOrientationDownMirrored,  // horizontal flip
    UIImageOrientationLeftMirrored,  // vertical flip
    UIImageOrientationRightMirrored, // vertical flip
} UIImageOrientation;

créer une méthode comme:

NSString *stringWithUIImageOrientation(UIImageOrientation input) {
    NSArray *arr = @[
    @"UIImageOrientationUp",            // default orientation
    @"UIImageOrientationDown",          // 180 deg rotation
    @"UIImageOrientationLeft",          // 90 deg CCW
    @"UIImageOrientationRight",         // 90 deg CW
    @"UIImageOrientationUpMirrored",    // as above but image mirrored along other axis. horizontal flip
    @"UIImageOrientationDownMirrored",  // horizontal flip
    @"UIImageOrientationLeftMirrored",  // vertical flip
    @"UIImageOrientationRightMirrored", // vertical flip
    ];
    return (NSString *)[arr objectAtIndex:input];
}

Tout ce que vous avez à faire est de :

  1. nom de votre fonction.

  2. copier le contenu d'enum et le coller entre NSArray *arr = @[ et ]; return (NSString *)[arr objectAtIndex:entrée];

  3. mettre un@ , " et la virgule

  4. Le PROFIT!!!!

29voto

Geri Points 3572

Ceci sera validé par le compilateur, afin que vous ne mélangiez pas les index par inadvertance.

 NSDictionary *stateStrings =
 @{
   @(MCSessionStateNotConnected) : @"MCSessionStateNotConnected",
   @(MCSessionStateConnecting) : @"MCSessionStateConnecting",
   @(MCSessionStateConnected) : @"MCSessionStateConnected",
  };
NSString *stateString = [stateStrings objectForKey:@(state)];
 

14voto

ajmccall Points 788

J'ai trouvé ce site Web (à partir duquel l'exemple ci-dessous est pris) qui fournit une solution élégante à ce problème. L'envoi d'origine provient toutefois de cette réponse StackOverflow .

 // Place this in your .h file, outside the @interface block
typedef enum {
    JPG,
    PNG,
    GIF,
    PVR
} kImageType;
#define kImageTypeArray @"JPEG", @"PNG", @"GIF", @"PowerVR", nil

...

// Place this in the .m file, inside the @implementation block
// A method to convert an enum to string
-(NSString*) imageTypeEnumToString:(kImageType)enumVal
{
    NSArray *imageTypeArray = [[NSArray alloc] initWithObjects:kImageTypeArray];
    return [imageTypeArray objectAtIndex:enumVal];
}

// A method to retrieve the int value from the NSArray of NSStrings
-(kImageType) imageTypeStringToEnum:(NSString*)strVal
{
    NSArray *imageTypeArray = [[NSArray alloc] initWithObjects:kImageTypeArray];
    NSUInteger n = [imageTypeArray indexOfObject:strVal];
    if(n < 1) n = JPG;
    return (kImageType) n;
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X