Цель C Оператор логического ИЛИ не оценивается в блоке

Я пытаюсь проверить, какие значения элемента массива равны друг другу или NSNumber 10. Массив имеет количество 15. Проблема в том, что когда я проверяю значение NSNumber 10 в if statementКод, похоже, не оценивает.

Например, в приведенном ниже массиве код должен возвращать, что значение в индексе 0 присутствует в индексах {0, 9, 10}, поскольку NSNumber 1 присутствует в индексах 0 и 10 и NSNumber 10 присутствует в индексе 9.

1-2-3-4-5-6-7-8-9-10-1-2-3-4-5

Тем не менее, он только оценивает, NSNumber значение в индексе 0 равно NSNumber 1 и не NSNumber 10. Вывод не такой, как ожидалось, {0, 9, 10}, а только {0, 10}.

for (NSNumber *number in mutableArray) {
    self.matchingIndex = [mutableArray indexesOfObjectsPassingTest:
                         ^BOOL(NSNumber *obj, NSUInteger idx, BOOL *stop) 
    {
        BOOL returnValue;
        NSNumber *ten = [NSNumber numberWithInt:10];
        if ([number isEqualToNumber:obj] || [number isEqualToNumber:ten])
        {
            returnValue = TRUE;
        }
        return returnValue;  
    }];
    [self testIndexSet:self.matchingIndex];
}     

1 ответ

Решение

Ваше ожидание неверно. numberитератор внешнего цикла будет равен десяти только для элемента @10 в массиве. Ожидаемый результат для цикла - два индекса для элементов 1..5 и один индекс для остальных.

Если вы хотите, чтобы цикл нашел элемент @10 и включал его в каждый результат, измените условие с...

if ([number isEqualToNumber:obj] || [number isEqualToNumber:ten])

чтобы...

if ([number isEqualToNumber:obj] || [obj isEqualToNumber:ten])

Кстати, блок можно обозначить более просто как...

NSIndexSet *matchingIndex = [mutableArray indexesOfObjectsPassingTest:^BOOL(NSNumber *obj, NSUInteger idx, BOOL *stop) {
    return ([number isEqualToNumber:obj] || [obj isEqualToNumber:@10]);
}];
Другие вопросы по тегам