从字符串切换typedef枚举类型

时间:2012-02-22 13:38:45

标签: objective-c ios enums nsstring typedef

我使用了下面的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 个答案:

答案 0 :(得分:3)

你不能将字符串转换为枚举,因为枚举名称没有保存,相反,你可以通过比较字符串创建一个函数,这样做的时间更长,但我不认为你有其他选择。宏可能会有所帮助:

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;

答案 1 :(得分:2)

这是人们在寻找的东西。这是没有任何字符串比较的最短答案:

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

答案 2 :(得分:1)

您将字符串转换为枚举,但这不起作用。字符串是指针,枚举是数字,即使你可以转换它们,指针也不会有相同的值。 你需要这样的东西:

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

等等。或者转换为枚举的一些方法,然后您可以打开它。 那些break语句也没用了

答案 3 :(得分:0)

枚举,代表枚举 - 您只是为某些整数创建名称。

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

表示第一个为0, LatestNews 为1,依此类推。

在你的函数中,你将NSString转换为NSInteger - 因此你没有得到正确的值。

您需要使用[string isEqualToString:]方法将字符串与某些条件值进行比较。

Enumeration declaration explained