如何检查一个NSString是否包含NSArray中的一个NSString?

我正在做一个iOS应用程序,我需要弄清楚NSString包含NSArray中的任何NSStrings

 BOOL found=NO; for (NSString *s in arrayOfStrings) { if ([stringToSearchWithin rangeOfString:s].location != NSNotFound) { found = YES; break; } } 

这可能是您的用例的一个愚蠢的优化,但取决于您正在迭代的数组的大小,使用NSArray's indexOfObjectWithOptions:passingTest:方法可能会有帮助/更高性能。

用这个方法,你传递一些选项和一个包含你的testing的块。 通过NSEnumerationConcurrent选项将允许您的块的评估发生在多个线程并发,并可能加快速度。 我重用了不变式的testing,但方式稍有不同。 该块function上返回一个BOOL,类似于不变式实现中的“found”variables。 “* s​​top = 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]); 

Adam的回答非常小的安全性改进:“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); 
 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF IN %@", theArray]; BOOL result = [predicate evaluateWithObject:theString]; 

与iOS8的发布一样,Apple为NSString添加了一个名为localizedCaseInsensitiveContainsString的新方法。 这将完全做你想要的方式:

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