Это может быть глупая оптимизация для вашего варианта использования, но в зависимости от размера массива, который вы повторяете, может быть полезно / более эффективно использовать метод NSArray's
indexOfObjectWithOptions:passingTest:
.
С помощью этого метода вы передаете некоторые параметры и блок, содержащий ваш тест. Передача опции NSEnumerationConcurrent
позволит одновременно выполнять оценку вашего блока в нескольких потоках и потенциально ускорить процесс. Я повторно использовал тест инварианта, но немного по-другому. Блок функционально возвращает BOOL, похожий на переменную "found" в реализации инварианта. "* Stop = YES;" Строка указывает на то, что итерация должна остановиться.
См. Справочную документацию NSArray для получения дополнительной информации. Ссылка
NSArray *arrayOfStrings = ...;
NSString *stringToSearchWithin = ...";
NSUInteger index = [arrayOfStrings indexOfObjectWithOptions:NSEnumerationConcurrent
passingTest:^(id obj, NSUInteger idx, BOOL *stop)
{
NSString *s = (NSString *)obj;
if ([stringToSearchWithin rangeOfString:s].location != NSNotFound) {
*stop = YES;
return YES;
}
return NO;
}];
if (arrayOfStrings == nil || index == NSNotFound)
{
NSLog(@"The string does not contain any of the strings from the arrayOfStrings");
return;
}
NSLog(@"The string contains '%@' from the arrayOfStrings", [arrayOfStrings objectAtIndex:index]);