2009-05-29 32 views
23

Vì vậy, tôi đã có định nghĩa này:Objective-c: NSString để enum

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

Sau đó, tôi đã có một biến kiểu car_colors: car_colors myCar;

Câu hỏi đặt ra là, tôi nhận được màu của xe trong một NSString. Nó phải là một NSString, tôi không thể thay đổi điều đó. Làm thế nào tôi có thể chuyển đổi từ NSString sang loại car_colors?

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

bất kỳ ý tưởng nào? cảm ơn!

+0

gì chính xác không hoạt động? Đặt một breakpoint trong phương thức mà bạn đang chuyển đổi chuỗi thành một số nguyên, bạn sẽ có thể thấy chính xác phần nào đang đi haywire. –

Trả lời

18

Thay vì sử dụng mảng, tại sao không sử dụng từ điển; Bạn có màu NSString như là chìa khóa, và bạn trả lại bất cứ điều gì NSNumber bạn muốn. Cái gì đó như; (Long cuộn cho rõ ràng).

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 có một ý nghĩa khác, chúng ta không thể thay thế enum bằng NSArray hoặc NSDictionary. Khi bạn phát triển các thư viện, bạn phải sử dụng các kiểu dữ liệu thích hợp. Đây không phải là một giải pháp tối ưu cho nó. –

+5

@AntoBinishKaspar Câu hỏi không phải là về một thư viện về việc làm việc xung quanh một vấn đề cụ thể với một ràng buộc cụ thể. Và ai nói bạn không thể thay thế enum bằng một từ điển? Tôi không nói về một sự thay thế, tôi đang nói về một cách khác để tiếp cận một giải pháp. – Abizern

7

Bạn cũng có thể đặt các giá trị trong một mảng.

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

Sau đó, bạn có thể sử dụng indexOfObject để lấy chỉ mục của một chuỗi cụ thể.

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

Tôi tìm thấy giải pháp:

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

Nhưng tôi không thích 'nếu' phong cách này, những gì nếu tôi đã có một ngàn màu sắc? Không có giải pháp tự động hơn?

+4

Từ điển - Như tôi đã nói trong câu trả lời của tôi. – Abizern

+0

Tôi sẽ không bỏ phiếu bạn, nhưng những gì bạn đang làm là sai. Câu trả lời của @Tom là tốt hơn nhiều so với làm điều này. –

46

đây là một thực hiện sử dụng NSDictionary và enum hiện

trong file .h:

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

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

trong file .m: sử dụng

@implementation NSString (EnumParser) 

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

@end 

mẫu:

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

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

Đây phải là câu trả lời được chấp nhận. Tạo ra các enums của bạn Mảng hoặc Từ điển không phải là một cách hay để tiếp cận vấn đề này. – lespommes

+0

Lưu ý rằng nếu giá trị chính xác của enum không quan trọng, thì bạn không cần phải xác định các giá trị. – ThomasW

3

Có rất nhiều câu trả lời tuyệt vời cho điều này tại đây: Converting between C enum and XML

Về cơ bản, chúng giống như Abizern, nhưng sạch hơn và dễ làm việc hơn nếu ứng dụng của bạn thực hiện chuyển đổi chuỗi thành nhiều lần. Có các giải pháp giữ cho các định nghĩa chuỗi và enum cùng nhau và các cách để thực hiện chuyển đổi cho mỗi dòng mã đơn lẻ, dễ đọc.

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

lựa chọn của tôi =)