2011-05-18 27 views
1

我想創建一個類似枚舉的字符串集合,這種方式也使我能夠按順序值排序,而不是按字母值排序。例如:在Objective-C中創建有序字符串值的有效方法

「極低」= 0

「非常低」= 1

「低」= 2

「中等= 3

「高」= 4

等等。

我知道在Java和C#中,例如枚舉類型可以除了它們的序數值之外還有一個值。

有沒有什麼辦法可以在Objective-C中實現相同的目標?

謝謝!

回答

1

只要保持字符串I/O和爲所有計算使用枚舉。例如,定義枚舉:

typedef enum { ExtremelyLow, VeryLow, ... High } Rating; 

您可以使用此枚舉在switch報表等,現在你可以使用一個NSArray或只是一個簡單的C-陣列從枚舉文字映射到字符串:

NSString *RatingToString[] = { @"Extremely Low", @"Very Low", ..., @"High" }; 

Rating myRating; 
NSString *strMyRating = RatingToString[myRating]; 

從字符串版本到枚舉是更多的參與,你可以使用相同的RatingToString數組,並進行適當的比較(可能不區分大小寫,模糊等)。你也可以使用一個NSDictionary

NSDictionary StringToRating = [NSDictionary dictionaryWithObjectsAndKeys: RatingToString[ExtremelyLow], [NSNumber numberWithInt:ExtremelyLow, ..., nil]; 

現在查找會做你的字符串完全匹配,並返回一個Rating包裝成一個NSNumber

+0

字典的想法看起來非常好。我可以像這樣製作靜態數組,並且它會像我想要的那樣完成 - 我可以從文件讀取字符串,並通過調用字典objectForKey立即知道它的值:並從文件中傳遞字符串作爲鍵 – 2011-05-18 13:38:25

+0

「NSString * strMyRating = RatingToString [myRating];」你正在初始化'NSString *''char *' – user102008 2012-05-04 21:25:35

+0

@ user102008 - oops,修正了錯字,謝謝 – CRD 2012-05-04 21:47:23

2

我不知道直接的方法來做到這一點。但是,您可以定義一個OBJ-C級這樣的:

@interface EnumLike : NSObject 
{ 
    NSString* title; 
    NSInteger value; 
} 

@property (nonatomic, readonly) NSString* title; 
@property (nonatomic, readonly) NSInteger value; 

// Something like enum 
+ (id)extremelyLow; 
+ (id)veryLow; 
... 
+ (id)high; 
}; 

除了與開關這方面的工作可以做的工作。我經常使用類似的類型爲用戶聲明一些「枚舉」,因爲這些實例的列表可以綁定到NSArrayController並在UI中使用。

+0

哇這是brilliate!這幾乎就是我正在尋找的東西。唯一缺少的部分是添加選項來爲這些「預定義」元素創建一個,方法是爲該值提供一個字符串 - 例如「非常低」,然後獲取相應的EnumLike對象。我需要這個,因爲我正在從一個文件中讀取數據,我需要將這些字符串解析成我可以使用的東西。 – 2011-05-18 09:29:19

0

您可以使用一類像Gobra建議或c結構數組:

typedef struct { 
    int      type; 
    NSString     *desc; 
} NXENumToNSString; 



NXENumToNSString kNXGMWidgetTypes[] = { 
    {1, @""}, 
    {2, @"imageGallery"}, 
    {3, @"dotImageGallery"}, 
    {4, @"video"}, 
    {5, @"webView"}, 
    {6, @"image"} 
}; 

NSInteger 
intToStringForArray(NXENumToNSString *buffer, size_t length, NSString *str) 
{ 
    int result = NSIntegerMin; 
    NXENumToNSString *scan, *stop; 
    scan = buffer; 
    stop = scan + length; 
    while (scan < stop) { 
     if ([scan->desc isEqualToString:str]) { 
      result = scan->type; 
      break; 
     } 
     scan++; 
    } 
    return result; 
} 

那麼你可以做這樣的事情:

size_t l = sizeof(kNXGMWidgetTypes)/sizeof(NXENumToNSString); 
NSInteger result = intToStringForArray(kNXGMWidgetTypes, l, str); 
相關問題