Является ли значение "в" некоторых других значений, в цель-с - PullRequest
3 голосов
/ 09 ноября 2011

Происходя из очень испорченного семейного воспитания (турбо-паскаль, питон, рубин), я немного озадачен, когда дело доходит до выполнения всех домашних дел по дому.

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

 x = some_function_return_value();
 if x in (1,4,17,29,35):

Вот так я и писал. Теперь с Objective-C я, очевидно, не могу этого сделать. И я искал старый гугл, но не нашел ответа, и старого руководства, и ничего там, так как вы делаете это в Objective-C, не делая что-то капризное, как показано ниже?

 if (x == 1 || x == 4 || x == 17 || x == ...) {

Отредактировано : в данном случае это (int), я знаю, что для NSArray и NSString есть методы для этого

Ответы [ 4 ]

4 голосов
/ 09 ноября 2011

Если речь идет о целочисленных значениях, вы можете использовать switch:

switch (x) {
    case 1:
    case 4:
    case 17:
    case 29:
    case 35:
        do_something();
        break;
}

Не забывайте, что в C / C ++ / Objective-C дела по умолчанию переходят к следующему. Вы должны добавить break; операторов, чтобы предотвратить это.

Для нецелых значений вы должны делать длинные if операторы с большим количеством повторений, поскольку C не предоставляет синтаксического сахара или функций, которые многие языки сценариев должны сокращать.

Другим способом было бы, например, подготовить массив и затем выполнить:

if ([myArray containsObject:[NSNumber numberWithInteger:x]])

или даже лучше, используйте NSSet для этого. Это будет работать для большинства объектов, например, оно также будет работать со строками.

1 голос
/ 09 ноября 2011

Вот моя глупая программа дня:

bool int_exists_in_array(const int n, const int a[], const size_t elementCount) {
    return (0 != elementCount) &&
      (n == a[0] || int_exists_in_array(n, a + 1, elementCount - 1U));
}

так вот:

if x in (1,4,17,29,35):

становится:

const int a[] = { 1, 4, 17, 29, 35 };
if (int_exists_in_array(x, a, sizeof(a)/sizeof(a[0]))) {
  ...
}
1 голос
/ 09 ноября 2011

Существует быстрый синтаксис в цели C, который использует "in" для циклического перебора коллекций, однако, учитывая, что для этого нужно преобразовать значения int в NSNumbers, здесь, вероятно, проще использовать C

BOOL success = NO;
int size = 5
NSInteger numbers[size] = {1,4,17,29,35};

for (int i = 0; i < size; i++) {
    if (yourValue == numbers[i]) {
        success = YES;
        break;
    }
}

if (success) {
    /* do your stuff */
}

по общему признанию, не так хорош, как питон ...

0 голосов
/ 09 ноября 2011

Вы можете использовать NSSet в дополнение к NSValue.

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