我正在制作iOS应用,我需要确定NSString
是否包含NSStrings
中的任何NSArray
。
答案 0 :(得分:35)
BOOL found=NO;
for (NSString *s in arrayOfStrings)
{
if ([stringToSearchWithin rangeOfString:s].location != NSNotFound) {
found = YES;
break;
}
}
答案 1 :(得分:14)
对于您的用例可能是一个愚蠢的优化,但是根据您正在迭代的数组的大小,使用NSArray's
indexOfObjectWithOptions:passingTest:
方法可能会有帮助/更高效。
使用此方法,您可以传递一些选项和包含测试的块。传递NSEnumerationConcurrent
选项将允许您的块的评估同时发生在多个线程上,并可能加快速度。我重复使用了invariant的测试,但方式略有不同。该块在函数的实现中在函数上返回类似于“found”变量的BOOL。 “* stop = YES;” line表示迭代应该停止。
有关详细信息,请参阅NSArray参考文档。 Reference
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]);
答案 2 :(得分:4)
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);
答案 3 :(得分:4)
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF IN %@", theArray];
BOOL result = [predicate evaluateWithObject:theString];
答案 4 :(得分:0)
与iOS8的发布一样,Apple为NSString
添加了一种名为localizedCaseInsensitiveContainsString
的新方法。这将完全按照你想要的方式做到:
BOOL found = NO;
NSString *string = @"ToSearchFor";
for (NSString *s in arrayOfStrings){
if ([string localizedCaseInsensitiveContainsString:s]) {
found = YES;
break;
}
}