簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM