我能否向Objective-C枚举类型中添加方法?

7

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个回答

21

不幸的是,无法向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——你可以看到上面的代码如果使用单数类型名称会更清晰。您还应该将两个或三个字母的前缀添加到所有类型名称(以及此函数)中,以避免命名冲突。)


你能详细说明如何在Swift中添加方法吗?我们很快就要转向Swift了。 - Ky -
3
Swift方法:非常简单!只需编写一个函数,然后将其放在枚举类型的“{”中,并引用“self”即可。 - andyvn22

5
NSString * const ToppingsList[] = {
    [PEPPERONI] = @"Pepperoni",
    [EXTRA_CHEESE] = @"Extra Cheese",
    [SECRET_SAUCE] = @"Secret Sauce",
};
NSLog("Topping: %@", ToppingList[PEPPERONI]);

在声明枚举后,您可以添加此内容以使用字符串类型。这看起来像toString()方法。

编辑:与此同时,@andyvn22是正确的。在Objective-C中无法向枚举添加方法。我只是给出了一种使用带字符串的枚举的解决方案。


1

是的,它不像Java或.NET那样直截了当。但是,我认为yar1vn的第二个选项看起来还不错:

将objective-c typedef转换为其字符串等效项

您还可以将枚举序列化为NSString扩展,使得可以请求NSString根据您的枚举给您一个字符串。


0

很抱歉,使用Objective-C不能在枚举中声明方法。 不过,你可以将枚举作为参数传递给任何方法。这可能是你的解决方案:

typedef NS_ENUM(int, PatientActivity)
{
    Exercise = 101,
    Smoke,
    Alcohol
};

 - (void)getPatientDetail:(NSString *)PatID withActivity:(enum PatientActivity) activity;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接