【问题标题】:Objective-C - Using Enum identifiers as string [duplicate]Objective-C - 使用枚举标识符作为字符串[重复]
【发布时间】:2014-08-11 12:07:52
【问题描述】:

以下枚举在 BMI 工具中的多个地方使用:

typedef NS_ENUM (NSInteger, BMIStatus) {
    Malnutrition = 1,
    Anorexia = 2,
    Thinness = 3,
    Normal = 4,
    Overweight = 5,
    Obesity = 6,
    Morbid = 7
};

使用“Malnutrition”作为字符串有诀窍吗?考虑到我有一个名为“Malnutrition.png”的图像,我想使用经典的 ImageNamed 加载它,并且不使用存储 [1] => @"Malnutrition" 的中间数组。

我的想法是使用一种[UIImage imageNamed:[NSString stringWithFormat:@"%e", Malnutrition]],其中 %e 指向枚举标识符而不是关联值。

谢谢。

【问题讨论】:

  • 这正是人们为枚举添加前缀以防止此问题的原因。我不确定是否有解决方法,但我建议在此处为您的枚举添加前缀(例如您的类前缀)。
  • 我看不出前缀如何让我轻松找到字符串@"Malnutrition",即使我同意为枚举添加前缀的建议。
  • 对不起,我完全误解了你的问题。你可以创建一个函数,比如NSString *BMIStatusToString(NSInteger n),它将每个值转换为特定的 NSString,这是一个好的解决方案吗?
  • 是的,就像@colinbrash 解决方案一样。映射方法似乎是这里唯一可行的解​​决方案。
  • 为什么要使用枚举?全局常量是更好的选择。

标签: ios objective-c enums


【解决方案1】:

不幸的是,使用 Objective-C 是不可能的。但是,如果您可以改用 Swift,它就是在 Swift 中。

这在历史上是在 Apple 的代码中使用NSString 常量处理的。例如:

UIKIT_EXTERN NSString *const NSFontAttributeName NS_AVAILABLE_IOS(6_0);

如果您需要在int 值和NSString 值之间进行映射,则需要编写一个映射函数。

另外,请确保为枚举和字符串常量添加前缀!

【讨论】:

  • 实际上我已经用前缀更新了我的枚举名称:) 谢谢你的回答,这是我所期望的解决方案。但我想确保在实施之前没有其他解决方案!
【解决方案2】:

如果您想要一个用于调试目的的字符串,请添加一个方法- (NSString*) stringFromBMIStatus,其中包含一个返回各种字符串的 switch 语句,并默认为意外输入打印数值。

如果你想要一个为每个枚举值提供NSImage 名称的字符串,请添加一个方法- (NSString*) imageNameFromBMIStatus,可能会为意外输入返回nil。

【讨论】:

  • 是的,这正是我所做的。尽管如此,我仍然想知道在哪里声明这些方法是最佳的。
猜你喜欢
  • 1970-01-01
  • 2015-08-06
  • 2011-09-11
  • 1970-01-01
  • 2013-08-03
  • 1970-01-01
  • 1970-01-01
  • 2015-08-09
  • 2011-03-27
相关资源
最近更新 更多