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

时间:2011-01-15 21:55:24

标签: ios objective-c nsstring nsarray

我正在制作iOS应用,我需要确定NSString是否包含NSStrings中的任何NSArray

5 个答案:

答案 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。 “* s​​top = 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;
    }
}