【问题标题】:How to check if an NSString contains one of the NSStrings in an NSArray?如何检查 NSString 是否包含 NSArray 中的 NSString 之一?
【发布时间】:2011-06-09 19:07:19
【问题描述】:

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

【问题讨论】:

    标签: ios objective-c nsstring nsarray


    【解决方案1】:
    BOOL found=NO;
    for (NSString *s in arrayOfStrings)
    {
      if ([stringToSearchWithin rangeOfString:s].location != NSNotFound) {
        found = YES;
        break;
      }
    }
    

    【讨论】:

      【解决方案2】:

      对于您的用例来说,这可能是一个愚蠢的优化,但取决于您正在迭代的数组有多大,使用 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]);
      

      【讨论】:

      • 谢谢亚当!非常有用的一段代码,效果很好!
      【解决方案3】:

      对 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);
      

      【讨论】:

        【解决方案4】:
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF IN %@", theArray];
        BOOL result = [predicate evaluateWithObject:theString];
        

        【讨论】:

          【解决方案5】:

          随着 iOS8 的发布,Apple 为 NSString 添加了一个新方法,称为 localizedCaseInsensitiveContainsString。这将更轻松地完成您想要的操作:

          BOOL found = NO;
          NSString *string = @"ToSearchFor";
          for (NSString *s in arrayOfStrings){
              if ([string localizedCaseInsensitiveContainsString:s]) {
                  found = YES;
                  break;
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-08-14
            • 2018-11-02
            • 2011-10-02
            • 1970-01-01
            • 1970-01-01
            • 2011-11-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多