Переключение с типом перечисления typedef из строки - PullRequest
3 голосов
/ 22 февраля 2012

Я использовал перечисление typedef ниже, но коммутатор всегда возвращает регистр по умолчанию, почему?

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;
}

Ответы [ 4 ]

3 голосов
/ 22 февраля 2012

Вы не можете преобразовать строку в enum, так как имена перечислений не сохраняются, вместо этого вы можете создать функцию, которая делает это, сравнивая строки, это длиннее, но я не думаю, что у вас есть другой вариант,макрос может помочь:

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
}

, тогда вы можете сделать:

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;
2 голосов
/ 12 февраля 2013

Это то, что ищет человек. Вот кратчайший ответ без сравнения строк:

// 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;
}
1 голос
/ 22 февраля 2012

Вы конвертируете строку в перечисление, это не работает.Строки - это указатели, перечисления - это числа, и даже если вы можете их привести, указатель не будет иметь того же значения.Вам понадобится что-то вроде:

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

и так далее.Или какой-нибудь метод для преобразования в enum, который затем можно включить.Кроме того, эти операторы перерыва бесполезны

0 голосов
/ 22 февраля 2012

Перечисление, означает перечисление - вы просто создаете имена для некоторых целых чисел.

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

означает, что first равно 0, LatestNews равно 1 и т. Д.

В вашей функции вы приводите NSString к NSInteger - следовательно, вы не получаете правильные значения.

Вам нужно использовать метод [string isEqualToString:] для сравнения вашей строки с некоторыми условными значениями.

Объяснение декларации перечисления

...