【问题标题】:Testing if NSMutableArray contains a string object测试 NSMutableArray 是否包含字符串对象
【发布时间】:2011-02-11 11:15:28
【问题描述】:

我有一个NSMutableArray,其中包含一些NSString 对象。如何测试数组是否包含特定的字符串文字?

我试过[array containsObject:@"teststring"],但没用。

【问题讨论】:

    标签: iphone nsarray


    【解决方案1】:

    你正在做的应该可以正常工作。例如

    NSArray *a = [NSArray arrayWithObjects:@"Foo", @"Bar", @"Baz", nil];
    NSLog(@"At index %i", [a indexOfObject:@"Bar"]);
    

    为我正确记录“在索引 1”。两个可能的缺点:

    1. indexOfObject 发送 isEqual 消息进行比较 - 您没有在类别中替换此方法?
    2. 确保您正在针对 NSNotFound 进行测试以查找失败,而不是(比如说)0。

    【讨论】:

    • 它在某些情况下不起作用,因为它会检查参考。
    • @Stoto 它不检查引用。如答案所述,它使用-isEqual:
    • 哈哈! @Stoto 听起来您一直在阅读此主题devforums.apple.com/thread/168948?start=0&tstart=0
    • 是的,我做到了 :) 我确信它会检查引用,但由于编译器优化,两个 @"Bar" 字符串常量基本上是一个字符串(指向相同数据的指针)
    • 作为记录,我测试了这个选项,它工作得很好。 Apple 在developer.apple.com/library/ios/#documentation/Cocoa/Reference/… 的引用明确指出isEqual: 用于比较。在NSString 对象上,isEqual: 测试字符串的内容。
    【解决方案2】:
    [array indexOfObject:object] != NSNotFound
    

    【讨论】:

      【解决方案3】:

      与字符串文字比较仅适用于代码示例。在现实世界中,您经常需要与 NSString* 实例进行比较,例如一个数组,在这种情况下 containsObject 失败,因为它与对象而不是值进行比较。

      您可以在您的实现中添加一个类别,该类别使用一种方法来扩展 NS(Mutable)Array,以检查它是否包含字符串(或您需要比较的任何其他类型);

      @implementation NSMutableArray (ContainsString)
      -(BOOL) containsString:(NSString*)string
      {
        for (NSString* str in self) {
          if ([str isEqualToString:string])
            return YES;
        }
        return NO; 
      }
      @end
      

      【讨论】:

      • 我认为这不是真的。 Apple 的 containsObjectindexOfObject 文档都说每个元素都会发送一个 isEqual: 消息,因此即使两个不同的 NSString 对象包含相同的字符内容,它也应该可以工作。
      • 只有当两个对象都是 NSString 时才成立
      【解决方案4】:

      你也可以使用谓词:

      NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF IN %@", theArray];
      BOOL result = [predicate evaluateWithObject:theString];
      

      【讨论】:

        【解决方案5】:

        对于每个对象

        [(NSString *) [array objectAtIndex:i] isEqualToString:@"teststring"];
        

        【讨论】:

        • 我投了反对票,因为它不是正确答案。您不需要手动迭代数组,因为 indexOfObject 工作正常。这个答案总是会更慢(发送许多消息,无法访问内部表示),而且更麻烦。只有当我自己发布另一个明确错误的答案时,我才会对答案投反对票。
        • 如果字符串不是静态的,我认为这是正确的。平等适用于静态字符串,但不适用于动态分配的字符串。
        • 它可能不是公认的答案,但它仍然是一个有效的答案。我不认为投反对票是合适的
        • 接受的答案是错误的,因为首先它会检查引用,如果您有示例中的字符串常量,则该引用可能相同,但如果动态创建相同的字符串(即将到来from file, web, ...) 其次,同样的事情有一个 containsObject: 方法,所以你不应该为此使用 indexOfObject:。因此这是正确的答案。
        • 使用 indexOfObject 是完全错误的,这是正确的答案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-27
        • 2020-11-03
        • 2017-11-21
        • 2014-09-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多