我想以一种方式创建一个类似枚举的字符串集,这样我也能够按顺序值而非字母值对它们进行排序。例如:
“极低”= 0
“非常低”= 1
“低”= 2
“中= 3
“高”= 4
等等。
我知道在Java和C#中,枚举类型除了序数值之外还可以有一个值。
有没有办法在Objective-C中实现相同的目标?
谢谢!
答案 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);