[英]How to check if an NSString contains one of the NSStrings in an NSArray?
我正在制作一個 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:
方法可能會有所幫助/性能indexOfObjectWithOptions:passingTest:
。
使用這種方法,您可以傳遞一些選項和一個包含您的測試的塊。 傳遞NSEnumerationConcurrent
選項將允許您的塊的評估同時發生在多個線程上,並可能加快速度。 我重用了不變量的測試,但方式略有不同。 該塊在功能上返回一個類似於 invariant 實現中的“found”變量的 BOOL。 “*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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.