だから、私はこの定義を持っています:
typedef enum {
red = 1,
blue = 2,
white = 3
} car_colors;
次に、car_colors型の変数を取得します。car_colorsmyCar;
問題は、NSStringで車の色を受け取ることです。 NSStringである必要があります。変更することはできません。 NSStringからcar_colorsタイプに変換するにはどうすればよいですか?
NSString *value = [[NSString alloc] initWithString:@"1"];
myCar = [value intValue]; // <-- doesn't work
何か案が?ありがとう!
配列を使用するのではなく、辞書を使用してみませんか。キーとして色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];
これはNSDictionary
と既存の列挙型を使用した実装です
.hファイル内:
typedef NS_ENUM(NSInteger, City) {
Toronto = 0,
Vancouver = 1
};
@interface NSString (EnumParser)
- (City)cityEnumFromString;
@end
.mファイル:
@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));
値を配列に入れることもできます。
NSArray *carColorsArray = @[@"red", @"blue", @"white"];
次に、indexOfObjectを使用して、特定の文字列のインデックスを取得できます。
car_colors carColor = [carColorsArray indexOfObject:@"blue"] + 1;
これには多くの素晴らしい答えがあります: C enumとXMLの間の変換
これらは基本的にAbizernのものと同じですが、アプリがこの文字列から列挙型への変換を頻繁に実行する場合は、少しクリーンで扱いやすくなります。文字列と列挙型の定義を一緒に保つソリューション、および変換をそれぞれ単一の読みやすいコード行にする方法があります。
// ...
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];
}
// ...
私の選択=)