如何检查一个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。 “* 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]);
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; } }