测试NSMutableArray是否包含字符串对象

tec*_*h74 40 iphone nsarray

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

我尝试[array containsObject:@"teststring"]但是这不起作用.

Ada*_*ght 87

你正在做什么应该工作正常.例如

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

为我正确记录"在索引1".两种可能的缺点:

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

  • @Stoto它不检查引用.它使用`-isEqual:`作为答案描述. (5认同)
  • 为了记录,我测试了这个选项,它完美地运行.Apple在https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html上的参考文献明确指出`isEqual:`用于比较.在`NSString`对象上,`isEqual:`测试字符串的内容. (3认同)

Bog*_*dan 77

[array indexOfObject:object] != NSNotFound
Run Code Online (Sandbox Code Playgroud)


Hen*_*rtz 8

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

你可以在你的实现中添加一个类别,它扩展了NS(Mutable)数组,并使用一种方法检查它是否包含字符串(或者你需要比较的其他类型);

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


小智 6

您也可以使用谓词:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF IN %@", theArray];
BOOL result = [predicate evaluateWithObject:theString];
Run Code Online (Sandbox Code Playgroud)


Mih*_*hta 5

对于每个对象

[(NSString *) [array objectAtIndex:i] isEqualToString:@"teststring"];
Run Code Online (Sandbox Code Playgroud)

  • 我贬低了因为它不是正确的答案.您不需要手动迭代数组,因为indexOfObject工作正常.这个答案将总是较慢(发送许多消息,无法访问内部表示),而且更加繁琐.当我自己发布另一个明确错误的答案时,我只会回答问题. (16认同)
  • 我认为如果字符串不是静态的,这是正确的.Equality适用于静态字符串,但不适用于动态分配的字符串. (6认同)
  • 它可能不是被接受的答案,但它仍然是一个有效的答案.我不认为投票是合适的 (4认同)