Как найти массив, содержащий объект (не используя цикл for)?

Я использую ниже код для проверки массива ary_navigationControllerViews, который содержит объект myclass или не работает, но мне нужно с отсутствием цикла. Я знаю, что у нас есть метод вроде containsObject, но как использовать в этой ситуации. Есть ли способ проверить это условие, не используя цикл for.

NSArray *ary_navigationControllerViews = [[NSArray alloc] initWithArray:[self.navigationController viewControllers]]; for(id obj_viewController in ary_navigationControllerViews) { if([obj_viewController isKindOfClass:[myClass class]]) { //some my code return; } } 

NSPredicate делает подобные задания намного проще.

 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY SELF.class.description == %@", [[myClass class] description]]; BOOL exists = [predicate evaluateWithObject:ary_navigationControllerViews]; if (exists) { //some my code return; } 

Чтобы получить экземпляр контроллера просмотра, вы можете использовать следующий код.

 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self.class.description == %@", [[self class] description]]; NSArray *vcs = [ary_navigationControllerViews filteredArrayUsingPredicate:predicate]; if ([vcs count] > 0) { id vc = [vcs objectAtIndex:0]; // Now vc is the view controller you are looking for } 

Вы можете использовать блоки:

 NSArray *arr = [NSArray arrayWithObjects:[NSString stringWithFormat:@"test"], [NSNumber numberWithInt:10], [NSNull null], nil]; __block int index = NSNotFound; [arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { if ([obj isKindOfClass:[NSNumber class]]) { index = idx; *stop = YES; } }]; if (index != NSNotFound) { NSLog(@"contains at %d", index); } 

Например, в вашем случае:

 [ary_navigationControllerViews enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { if ([obj isKindOfClass:[myClass class]]) { //some my code *stop = YES; } }]; 

Но я не думаю, что это уменьшит сложность кода yout. Циклы являются простейшими

Или, основываясь на ответе Некто, вы также можете прямо вернуть индекс следующим образом:

 NSArray *arr = [NSArray arrayWithObjects:[NSString stringWithFormat:@"test"], [NSNumber numberWithInt:10], [NSNull null], nil]; int index = [arr indexOfObjectPassingTest:^(id obj, NSUInteger idx, BOOL *stop) { if ([obj isKindOfClass:[NSNumber class]]) { *stop = YES; return YES; } return NO; }]; if (index != NSNotFound) { NSLog(@"contains at %d", index); } 

Наслаждаться.

Если вы действительно не можете использовать цикл for для этого, вам придется использовать такой метод, как indexesOfObjectsPassingTest: который применяет блок к каждому объекту в массиве и возвращает NSIndexSet всех элементов массива. Затем вы можете использовать это, чтобы вернуть новый массив только объектов, которые проходят ваш тест:

 check = ^ (id obj, NSUInteger idx, BOOL *stop) { return [obj isKindOfClass:[myClass class]]; }; NSIndexSet *objectsInMyClass = [[self.navigationController viewControllers] indexesOfObjectsPassingTest:check]; NSArray *filteredArray = [[self.navigationController viewControllers] objectsAtIndexes:objectsInMyClass]; 

Затем вы можете использовать makeObjectsPerformSelector или аналогично вашему конкретному коду.

  • Фильтр NSArray с NSObject внутри
  • NSArray? не имеет члена с именем «Генератор»
  • Как разбор словаря с ключами, имеющими массив словарей
  • Проверьте, идентичны ли все объекты в NSArray
  • Получение плавающей запятой из NSArray - Проблема
  • Обвинение Objc_msgSend и приложения
  • Сортировка объекта внутри NSArray?
  • Как получить текущую позицию в NSArray в объективе-C
  • Отображение данных NSSet из основных данных
  • Создание NSArray - EXC_BAD_ACCESS?
  • Сортировка NSMutableArray
  • Давайте будем гением компьютера.