Как проверить, содержит ли NSString одну из строк NSString в NSArray? - PullRequest
17 голосов
/ 16 января 2011

Я делаю приложение для iOS, и мне нужно выяснить, содержит ли NSString какой-либо из NSStrings в NSArray.

Ответы [ 5 ]

35 голосов
/ 16 января 2011
BOOL found=NO;
for (NSString *s in arrayOfStrings)
{
  if ([stringToSearchWithin rangeOfString:s].location != NSNotFound) {
    found = YES;
    break;
  }
}
14 голосов
/ 17 января 2011

Это может быть глупая оптимизация для вашего варианта использования, но в зависимости от размера массива, который вы повторяете, может быть полезно / более эффективно использовать метод 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]);
4 голосов
/ 13 сентября 2012
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF IN %@", theArray];
BOOL result = [predicate evaluateWithObject:theString];
4 голосов
/ 15 мая 2012

Очень небольшое улучшение безопасности в ответе Адама: есть большая проблема с «objectAtIndex:», потому что он совершенно не поточнобезопасен и слишком часто приводит к аварийному завершению работы вашего приложения. Итак, я делаю:

NSArray *arrayOfStrings = ...;
NSString *stringToSearchWithin = ...";
__block NSString *result = nil;
[arrayOfStrings indexOfObjectWithOptions:NSEnumerationConcurrent
                             passingTest:^(NSString *obj, NSUInteger idx, BOOL *stop) 
    {
        if ([stringToSearchWithin rangeOfString:obj].location != NSNotFound)
        {
            result = obj;
            *stop = YES;
            //return YES;
        }
        return NO;
    }];
if (!result) 
    NSLog(@"The string does not contain any of the strings from the arrayOfStrings");
else
    NSLog(@"The string contains '%@' from the arrayOfStrings", result);
0 голосов
/ 06 августа 2014

Как и в выпуске iOS8, Apple добавила в NSString новый метод под названием localizedCaseInsensitiveContainsString.Это точно сделает то, что вы хотите, намного проще:

BOOL found = NO;
NSString *string = @"ToSearchFor";
for (NSString *s in arrayOfStrings){
    if ([string localizedCaseInsensitiveContainsString:s]) {
        found = YES;
        break;
    }
}
...