【问题标题】:Can I add methods to an Objective-C enum?我可以向 Objective-C 枚举添加方法吗?
【发布时间】:2015-11-29 21:34:20
【问题描述】:

在 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 特定的行为,但我确信有办法。

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

【问题讨论】:

    标签: objective-c enums


    【解决方案1】:

    不,没有办法使用 Objective-C 在枚举中声明方法。 但是,您可以将枚举用作任何方法的参数。这可能是您的解决方案:

    typedef NS_ENUM(int, PatientActivity)
    {
        Exercise = 101,
        Smoke,
        Alcohol
    };
    
     - (void)getPatientDetail:(NSString *)PatID withActivity:(enum PatientActivity) activity;
    

    【讨论】:

      【解决方案2】:
      NSString * const ToppingsList[] = {
          [PEPPERONI] = @"Pepperoni",
          [EXTRA_CHEESE] = @"Extra Cheese",
          [SECRET_SAUCE] = @"Secret Sauce",
      };
      NSLog("Topping: %@", ToppingList[PEPPERONI]);
      

      在声明你的枚举之后,你可以添加它来使用类型字符串。好像是toString()方法

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

      【讨论】:

        【解决方案3】:

        不幸的是,无法向 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。
        • Swift 方法:如此简单!写个函数就好了,只是放在枚举的{里面,引用self
        【解决方案4】:

        是的,它不像 Java 或 .NET 那样简单。但是,我认为 yar1vn 答案的选项 2 看起来不错:

        Convert objective-c typedef to its string equivalent

        您还可以将枚举序列化添加为 NSString 扩展,从而可以要求 NSString 根据您的枚举为您提供一个字符串。

        【讨论】:

          猜你喜欢
          • 2011-01-28
          • 2014-02-13
          • 1970-01-01
          • 2012-06-03
          • 1970-01-01
          • 1970-01-01
          • 2011-11-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多