在Java中,我有一个类似的枚举:
public enum Toppings {
PEPPERONI,
EXTRA_CHEESE,
SECRET_SAUCE;
@Override
public String toString() {
switch(this) {
case EXTRA_CHEESE: return "Extra Cheese";
case SECRET_SAUCE: return "Secret Sauce™";
}
String name = name();
return name.charAt(0) + name.substring(1, name.length()).replace('_', ' ').toLowerCase();
}
}
我想在Objective-C中重新制作它。到目前为止,我已经做到了这一点:
NS_ENUM(NSInteger, Toppings) {
PEPPERONI,
EXTRA_CHEESE,
SECRET_SAUCE
};
然后我感到难过。 我如何制作toString()
方法?我知道它相当复杂并且使用了一些特定于Java的行为,但我确信还有其他方法。
唯一想到的是拥有一个具有此功能的独立助手类,但这似乎有点多,不是吗?
答案 0 :(得分:16)
不幸的是,无法将方法添加到Objective-C枚举。 (旁注:你可以将方法添加到Swift枚举中。)
传统上,为了这个目的,将使用一个独立的函数,其主体类似于您的Java方法:
NSString* NSStringFromToppings(Toppings toppings)
{
switch (toppings)
{
case PEPPERONI: return @"Pepperoni";
case EXTRA_CHEESE: return @"Extra Cheese";
case SECRET_SAUCE: return @"Secret Sauce";
}
}
(旁注:你应该将你的枚举Topping
命名为Toppings
而不是Page
- 您可以看到上面的代码如何使用单数类型名称更清晰。您还应该添加两个或三个 - 所有类型名称(和此函数)的字母前缀,以避免命名冲突。)
答案 1 :(得分:4)
NSString * const ToppingsList[] = {
[PEPPERONI] = @"Pepperoni",
[EXTRA_CHEESE] = @"Extra Cheese",
[SECRET_SAUCE] = @"Secret Sauce",
};
NSLog("Topping: %@", ToppingList[PEPPERONI]);
声明枚举后,可以添加此项以使用类型字符串。它似乎是toString()
方法
答案 2 :(得分:1)
是的,它不像Java或.NET那么简单。但是,我认为yar1vn的答案选项2看起来不错:
Convert objective-c typedef to its string equivalent
您还可以将枚举序列化添加为NSString扩展,从而可以让NSString根据您的枚举为您提供字符串。
答案 3 :(得分:0)
不,没有办法使用Objective-C在枚举中声明一个方法。 但是,您可以将枚举用作任何方法的参数。这可能是您的解决方案:
typedef NS_ENUM(int, PatientActivity)
{
Exercise = 101,
Smoke,
Alcohol
};
- (void)getPatientDetail:(NSString *)PatID withActivity:(enum PatientActivity) activity;