我可以在Objective-C枚举中添加方法吗?

时间:2015-09-03 21:47:53

标签: objective-c enums

在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的行为,但我确信还有其他方法。

唯一想到的是拥有一个具有此功能的独立助手类,但这似乎有点多,不是吗?

4 个答案:

答案 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()方法

编辑:同时@ andyvn22是对的。无法在Objective-C中向枚举添加方法。我刚刚给出了使用字符串枚举的解决方案。

答案 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;