web-dev-qa-db-ja.com

NSMutableArrayに文字列オブジェクトが含まれているかどうかのテスト

いくつかのNSMutableArrayオブジェクトを含むNSStringがあります。配列に特定の文字列リテラルが含まれているかどうかをテストするにはどうすればよいですか?

私は試した [array containsObject:@"teststring"]しかし、それは機能しません。

40
tech74

あなたがしていることはうまくいくはずです。例えば

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

「インデックス1で」を正しく記録します。 2つの可能性:

  1. indexOfObjectは比較を行うためにisEqualメッセージを送信します-このメソッドをカテゴリで置き換えていませんか?
  2. (たとえば)0ではなく、NSNotFoundに対してテストが失敗したことを確認してください。
87
Adam Wright
[array indexOfObject:object] != NSNotFound
77
Bogdan

文字列リテラルとの比較は、コード例でのみ機能します。現実の世界では、しばしば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
8
Henrik Hartz

述語を使用することもできます:

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

すべてのオブジェクトに対して

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