web-dev-qa-db-fra.com

Test si NSMutableArray contient un objet chaîne

J'ai un NSMutableArray qui contient quelques NSString objets. Comment puis-je tester si le tableau contient un littéral de chaîne particulier?

J'ai essayé [array containsObject:@"teststring"] mais cela ne fonctionne pas.

40
tech74

Ce que vous faites devrait bien fonctionner. Par exemple

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

Enregistre correctement "à l'index 1" pour moi. Deux faiblesses possibles:

  1. indexOfObject envoie isEqual messages pour faire la comparaison - vous n'avez pas remplacé cette méthode dans une catégorie?
  2. Assurez-vous que vous testez contre NSNotFound pour l'échec de la localisation, et non (disons) 0.
87
Adam Wright
[array indexOfObject:object] != NSNotFound
77
Bogdan

La comparaison avec les littéraux de chaîne ne fonctionne que dans les exemples de code. Dans le monde réel, vous devez souvent comparer les instances NSString *, par ex. un tableau, auquel cas containsObject échoue car il se compare à l'objet, pas à la valeur.

Vous pouvez ajouter une catégorie à votre implémentation qui étend le tableau NS (Mutable) avec une méthode pour vérifier si elle contient la chaîne (ou tout autre type avec lequel vous devez comparer);

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

Vous pouvez également utiliser un prédicat:

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

pour chaque objet

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