2012-02-22 65 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; 
}