Iphone - 维护字符串列表和相应的typedef枚举

时间:2010-03-28 18:47:10

标签: iphone enums

假设我有以下内容:

typedef enum functionType {ln, sin, sqrt} functionType;
NSArray *functions = [NSArray arrayWithObjects: @"ln", @"sin", @"sqrt", nil];

进一步假设*函数在运行时不会改变。

问题 - 有没有办法设置一个更新这两个结构的结构?所以我只需要跟踪一个列表,而不是两个。

为了解释发生了什么 - 想法是来自用户的字符串输入将存储在functionType类型的变量中。稍后,我会有这样的代码:

double valueOfFunction: (functionType) function withInput: (double) input
  switch (function) {
    case ln:
      return ln(input);
    case sin:
      return sin(input);
    case sqrt:
      return sqrt(input);
    //etc . . . could grow to include a lot of functions.
  }

而valueOfFunction需要很快。所以我不想在那里进行字符串比较。

1 个答案:

答案 0 :(得分:4)

听起来你想要一个从字符串到枚举对象的地图。有很多方法可以做到这一点。

您可以使用带有NSString键的NSDictionary和表示对象的NSNumber编码的int。

你可以使用函数名的NSArray(@“ln”,@“sin”等),只将索引存储到数组中;这基本上摆脱了枚举。

如果你真的想要一个枚举类型和字符串对象的连接列表,你也可以这样做:

typedef enum FunctionType {
  ln, sin, cos, tan, exp
} FunctionType;

typedef struct FunctionItem {
  FunctionType type;
  NSString *name;
} FunctionItem;

FunctionItem functions[] = {
  {ln, @"ln"},
  {sin, @"sin"},
  {cos, @"cos"},
  {tan, @"tan"},
  {exp, @"exp"},
};

请注意符号冲突!你不能拥有一个名为sin的枚举标识符,也可以使用标准的sin()函数。

祝你的计算器型应用好运!