Один идентификатор для нескольких значений.Является ли это возможным? - PullRequest
0 голосов
/ 30 января 2012

Я хотел бы, чтобы один идентификатор отвечал за несколько значений за один раз.если бы у меня был один, это то, что я мог бы сделать:

if (myVariable == IDENTIFIER)//instead of if(myVariable == 5 || myVariable == 7) if i need A LOT of values
    [myObject doSomething];

Есть ли возможность как-то его реализовать?

Ответы [ 4 ]

5 голосов
/ 30 января 2012

Я думаю, что ближе всего вы можете использовать битовые маски, чтобы вы представляли набор допустимых значений с помощью маски, в которой установлены все значения:

const int ALL_VALUES = (1 << 5) | (1 << 7);
if ((1 << myVariable) & ALL_VALUES)
  [myObject doSomething];

Выше, побитовое И используется для вычисления пересечения между текущим значением (рассматривается как 1-битная маска) и маской всех допустимых значений. Обратите внимание, что это будет работать только в том случае, если количество значений (и их фактических значений ) меньше количества битов в int.

1 голос
/ 30 января 2012

Объедините ответы. Сначала используйте функцию (вариант grahamparks):

BOOL isFoo(int identifier)
{
   ...
   return ...;
}

Для чего-то эта простая функция , вероятно, лучше, чем метод - вызов происходит намного быстрее и нет необходимости переопределять его Кроме того, если функция требуется только в текущем файле, объявите ее static BOOL isFoo..., чтобы ограничить видимость isFoo только файлом.

Теперь выберите тело, которое соответствует данным - пара значений, сравнения (грампарки); более нескольких значений, но все в пределах 0-31 (uint32_t) или 0-63 (uint64_t) учитывают битовую маску (разматывать); многие значения во всем диапазоне рассматривают множества (Ричард Дж. Росс III); или сверните свое собственное. Важный момент, какой бы алгоритм вы ни выбрали, изолирован внутри функции и может быть легко изменен при необходимости, не затрагивая остальную часть вашего кода.

В качестве существующих похожих примеров рассмотрим isDigit() и др. в стандартной библиотеке C. В некоторых реализациях они используют предварительно распределенные массивы логических значений (256 элементов в качестве аргумента является символом), поэтому проверка на членство в наборе - это просто операция индекса массива.

1 голос
/ 30 января 2012

Вот для чего нужны методы:

- (BOOL)isFoo(int identifier) {
    return identifier == 5 || identifier == 7;
}
1 голос
/ 30 января 2012

Вы можете иметь NSSet возможных значений:

NSSet *possibleValues = [NSSet setWithObjects:@"Value1", @"Value2", @"Value3", nil];

if ([possibleValues containsObject:myVariable])

Если вам нужно что-то, что работает с необработанным целым числом, дайте мне знать.

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