web-dev-qa-db-ja.com

Objective-c:列挙するNSString

だから、私はこの定義を持っています:

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

何か案が?ありがとう!

25
Hectoret

配列を使用するのではなく、辞書を使用してみませんか。キーとして色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];
18
Abizern

これは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));
52
lha

値を配列に入れることもできます。

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

次に、indexOfObjectを使用して、特定の文字列のインデックスを取得できます。

car_colors carColor = [carColorsArray indexOfObject:@"blue"] + 1;
8
Tom Jefferys

これには多くの素晴らしい答えがあります: C enumとXMLの間の変換

これらは基本的にAbizernのものと同じですが、アプリがこの文字列から列挙型への変換を頻繁に実行する場合は、少しクリーンで扱いやすくなります。文字列と列挙型の定義を一緒に保つソリューション、および変換をそれぞれ単一の読みやすいコード行にする方法があります。

3
andyvn22
// ...
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];
}
// ...

私の選択=)

1
uranpro