2012-02-22 63 views
3

我在下面使用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; 
} 
+0

你不能施放的'NSString'为整数,这是'enum'。 – Costique 2012-02-22 13:41:58

+0

...因为'temp'不符合任何情况? – 2012-02-22 13:42:08

+0

@ Costique,@ Vince有没有解决方案? – 2012-02-22 13:43:15

回答

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

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

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

等。或者一些方法转换为一个枚举,然后可以打开。 此外,这些突破语句是无用的

0

该枚举,代表枚举 - 你只是为一些整数创建名称。

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

意味着第一是0,办事指南为1,等等。

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

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

Enumeration declaration explained

2

这是PPL在找什么。这里是最简单的回答没有任何字符串比较:

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