在Objective-C中创建有序字符串值集的有效方法

时间:2011-05-18 08:20:08

标签: objective-c enums key-value

我想以一种方式创建一个类似枚举的字符串集,这样我也能够按顺序值而非字母值对它们进行排序。例如:

“极低”= 0

“非常低”= 1

“低”= 2

“中= 3

“高”= 4

等等。

我知道在Java和C#中,枚举类型除了序数值之外还可以有一个值。

有没有办法在Objective-C中实现相同的目标?

谢谢!

3 个答案:

答案 0 :(得分: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中使用。

答案 1 :(得分: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

答案 2 :(得分: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);