2009-05-29 35 views
23

所以,我有这样的定义:的Objective-C:的NSString枚举

typedef enum { 
    red = 1, 
    blue = 2, 
    white = 3 
} car_colors; 

然后,我有型car_colors的变量: car_colors myCar;

问题是,我收到NSString中汽车的颜色。它必须是NSString,我不能改变它。我如何从NSString转换为car_colors类型?

NSString *value = [[NSString alloc] initWithString:@"1"]; 
myCar = [value intValue]; // <-- doesn't work 

有什么想法吗? 谢谢!

+0

究竟不起作用?在要将字符串转换为整数的方法中放置一个断点,您应该能够确切地看到哪个部分会发生故障。 – 2009-05-29 14:24:03

回答

18

而不是使用数组,为什么不使用字典;你有颜色NSString作为键,并且你返回你想要的任何NSNumber。就像是; (为了清晰起见,啰嗦)。

NSDictionary *carColourDictionary = @{@"Red": @1, 
             @"Blue": @2, 
             @"White": @3}; 

// Use the dictionary to get the number 
// Assume you have a method that returns the car colour as a string: 
// - (NSString *)colourAsString; 
int carColour = carColourDictionary[object colourAsString]; 
+0

Enum有不同的含义,我们不能用NSArray或NSDictionary替换枚举。开发库时,您必须使用适当的数据类型。这不是一个最佳的解决方案。 – 2011-11-02 12:51:14

+5

@AntoBinishKaspar问题不是关于一个图书馆,而是关于解决特定问题的一个特定约束。谁说你不能用字典取代枚举?我不是在谈论替代品的下降,而是在谈论解决方案的另一种方式。 – Abizern 2012-01-05 16:05:47

7

您也可以将值放入数组中。

NSArray *carColorsArray = @[@"red", @"blue", @"white"]; 

然后,您可以使用indexOfObject获取特定字符串的索引。

car_colors carColor = [carColorsArray indexOfObject:@"blue"] + 1; 
-6

我找到了解决办法:

if ([car_color isEqualToString:@"1"]) 
     return red; 
if ([tipo_pdi isEqualToString:@"2"]) 
     return blue; 
if ([tipo_pdi isEqualToString:@"3"]) 
     return white; 

但我不喜欢这样的“如果”的风格,如果我有什么千个色?没有更自动的解决方案吗?

+4

字典 - 正如我在我的回答中所说的。 – Abizern 2009-05-29 15:12:21

46

这里使用NSDictionary现有枚举

在.h文件中的实现和:在.m文件

typedef NS_ENUM(NSInteger, City) { 
    Toronto   = 0, 
    Vancouver  = 1 
}; 

@interface NSString (EnumParser) 
- (City)cityEnumFromString; 
@end 

@implementation NSString (EnumParser) 

- (City)cityEnumFromString{ 
    NSDictionary<NSString*,NSNumber*> *cities = @{ 
          @"Toronto": @(Toronto), 
          @"Vancouver": @(Vancouver), 
          }; 
    return cities[self].integerValue; 
} 

@end 

示例用法:

NSString *myCity = @"Vancouver"; 
City enumValue = [myCity cityEnumFromString]; 

NSLog(@"Expect 1, Actual %@", @(enumValue)); 
3

这里有很多很好的答案:Converting between C enum and XML

它们基本上和Abizern的一样,但是如果你的应用程序对字符串到枚举的转换有很大的帮助,它们会更简洁一些。有一些解决方案将字符串和枚举定义保持在一起,并使转换成为单一,易于阅读的代码行。

1
// ... 
typedef enum { 
    One = 0, 
    Two, 
    Three 
} GFN; 
// ... 
#define kGFNPrefix @"GFNEnum_" 
// ... 
+ (NSString *)gfnToStr:(GFN)gfn { 
    return [NSString stringWithFormat:@"%@%d", kGFNPrefix, gfn]; 
} 

+ (GFN)gfnFromStr:(NSString *)str { 
    NSString *gfnStr = [str stringByReplacingOccurrencesOfString:kGFNPrefix withString:@""]; 
    return [gfnStr intValue]; 
} 
// ... 

我的选择=)