3 votes

Changement avec le type typedef enum de la chaîne de caractères

J'ai utilisé le typedef enum ci-dessous mais le switch retourne toujours le cas par défaut pourquoi ?

typedef enum {
    first,
    LatestNews,
    Opinion,
    Special,
    Sports,
    Thisweek,
} NAChannelTitle;

-(NSString *)getImageName:(NSString *)channelName {
    NAChannelTitle temp = (NAChannelTitle)[channelName stringByReplacingOccurrencesOfString:@" " withString:@""];
    NSLog(@"Temp : %@",temp);
    switch (temp) {
        case first:
            return @"background-channel-sporttitle-portrait.png";
            break;
        case LatestNews:
            return @"background-channel-title-portrait.png";
            break;
        case Opinion:
            return @"background-channel-title-portrait.png";
            break;
        case Special:
            return @"background-channel-sporttitle-portrait.png";
            break;
        case Sports:
            return @"background-channel-sporttitle-portrait.png";
            break;
        case Thisweek:
        default:
            return @"background-channel-title-portrait.png";
            break;
    }
    return nil;
}

3voto

MByD Points 78505

Vous ne pouvez pas convertir une chaîne de caractères en un enum, puisque les noms des enums ne sont pas sauvegardés, à la place, vous pouvez créer une fonction qui le fait, en comparant les chaînes de caractères, c'est plus long, mais je ne pense pas que vous ayez d'autre option. une macro peut aider :

NAChannelTitle getEnumTitle(NSString *sTitle) {
#define CHECK_ENUM(X)   if([sTitle isEqualToString:@#X]) return X        
    CHECK_ENUM(first);
    // the same for all enum
    return defaultEnum; // add this to the enum
#undef CHECK_ENUM
}

alors vous pouvez le faire :

NAChannelTitle temp = getEnumTitle(channelName);
NSLog(@"Temp : %d",temp);
switch (temp) {
    case first:
        return @"background-channel-sporttitle-portrait.png";
        break;
    case LatestNews:
        return @"background-channel-title-portrait.png";
        break;
    case Opinion:
        return @"background-channel-title-portrait.png";
        break;
    case Special:
        return @"background-channel-sporttitle-portrait.png";
        break;
    case Sports:
        return @"background-channel-sporttitle-portrait.png";
        break;
    case Thisweek:
    default:
        return @"background-channel-title-portrait.png";
        break;
}
return nil;

2voto

N.Ramos Points 586

C'est ce que les gens recherchent. Voici la réponse la plus courte sans aucune comparaison de chaînes :

// Zoey.h
typedef enum {
    turnLeft,
    turnRight,
    turnTop,
    turnBottom
} arrowType;

// Zoey.m
NSString * const arrowTypeTypeArray[] = {
    @"turnLeft",
    @"turnRight",
    @"turnTop",
    @"turnBottom"
};

// A method to convert an enum to string.is it short enuff eh ?
-(NSString*) arrowTypeEnumToString:(arrowType)enumVal
{
  return arrowTypeArray[enumVal];
}

// An extra method to retrieve the int value from the C array of NSStrings
-(arrowType) arrowTypeStringToEnum:(NSString*)strVal
{
  int retVal;
  for(int i=0; i < sizeof(arrowTypeArray)-1; i++)
  {
    if([(NSString*)arrowTypeArray[i] isEqual:strVal])
    {
      retVal = i;
      break;
    }
  }
  return (arrowType)retVal;
}

1voto

exclowd Points 13

Vous convertissez une chaîne en un enum, ça ne marche pas. Les chaînes de caractères sont des pointeurs, les enums sont des nombres, et même si vous pouvez les convertir, un pointeur n'aura pas la même valeur. Vous aurez besoin de quelque chose comme :

if([temp isEqualToString:@"LatestNews"]){ ... }

et ainsi de suite. Ou une méthode pour convertir en un enum, que vous pouvez ensuite activer. De plus, ces instructions break sont inutiles

0voto

Peter Sarnowski Points 6822

L'enum, c'est l'abréviation de énumération - vous ne faites que créer des noms pour des entiers.

typedef enum {
    first,
    LatestNews,
    Opinion,
    Special,
    Sports,
    Thisweek,
} NAChannelTitle;

signifie que premièrement est égal à 0, Dernières nouvelles est égal à 1, et ainsi de suite.

Dans votre fonction, vous convertissez une NSString en NSInteger - vous n'obtenez donc pas les valeurs correctes.

Vous devez utiliser le [string isEqualToString:] pour comparer votre chaîne de caractères à certaines valeurs conditionnelles.

La déclaration d'énumération expliquée

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