Iphone - ведение списка строк и соответствующего перечисления typedef - PullRequest
0 голосов
/ 28 марта 2010

Предположим, у меня есть следующее:

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 Ответ

4 голосов
/ 29 марта 2010

Звучит так, будто вам нужна карта из строк для перечисления объектов. Есть несколько способов сделать это.

Вы можете использовать NSDictionary с ключами NSString и NSNumber-кодированными типами, представляющими объекты.

Вы можете использовать NSArray с именами функций (@ "ln", @ "sin" и т. Д.) И сохранять индекс только в массиве; это в основном избавляет от перечисления.

Если вы действительно хотите объединить список типов enum и строковых объектов, вы также можете сделать что-то вроде этого:

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 ().

Удачи в вашем приложении типа калькулятора!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...