【发布时间】:2011-06-09 19:07:19
【问题描述】:
我正在制作一个 iOS 应用程序,我需要确定 NSString 是否包含 NSArray 中的任何 NSStrings。
【问题讨论】:
标签: ios objective-c nsstring nsarray
我正在制作一个 iOS 应用程序,我需要确定 NSString 是否包含 NSArray 中的任何 NSStrings。
【问题讨论】:
标签: ios objective-c nsstring nsarray
BOOL found=NO;
for (NSString *s in arrayOfStrings)
{
if ([stringToSearchWithin rangeOfString:s].location != NSNotFound) {
found = YES;
break;
}
}
【讨论】:
对于您的用例来说,这可能是一个愚蠢的优化,但取决于您正在迭代的数组有多大,使用 NSArray's indexOfObjectWithOptions:passingTest: 方法可能会有所帮助/性能更高。
使用此方法,您可以传递一些选项和一个包含您的测试的块。传递NSEnumerationConcurrent 选项将允许对块的评估同时在多个线程上进行,并可能加快速度。我重用了不变量的测试,但方式略有不同。该块在功能上返回一个类似于不变量实现中的“found”变量的 BOOL。 "*stop = YES;"行表示应该停止迭代。
有关更多信息,请参阅 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]);
【讨论】:
对 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;
}
}
【讨论】: