Тестирование, если NSMutableArray содержит строковый объект - PullRequest
40 голосов
/ 23 апреля 2010

У меня есть NSMutableArray, который содержит несколько NSString объектов. Как я могу проверить, содержит ли массив определенный строковый литерал?

Я пытался [array containsObject:@"teststring"], но это не работает.

Ответы [ 5 ]

87 голосов
/ 23 апреля 2010

То, что вы делаете, должно работать нормально. Например

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

Правильно логи "По индексу 1" для меня. Две возможные слабости:

  1. indexOfObject отправляет isEqual сообщений для сравнения - вы не заменили этот метод в категории?
  2. Убедитесь, что вы проверяете NSNotFound на наличие ошибок, а не (скажем) 0.
77 голосов
/ 03 октября 2012
[array indexOfObject:object] != NSNotFound
8 голосов
/ 13 июня 2012

Сравнение со строковыми литералами работает только в примерах кода. В реальном мире вам часто нужно сравнивать с экземплярами NSString *, например, Массив, в этом случае с помощью selectedObject происходит сбой, поскольку он сравнивается с объектом, а не со значением.

Вы можете добавить категорию к вашей реализации, которая расширяет массив NS (Mutable) с помощью метода проверки, содержит ли он строку (или любой другой тип, с которым вам нужно сравнивать);

@implementation NSMutableArray (ContainsString)
-(BOOL) containsString:(NSString*)string
{
  for (NSString* str in self) {
    if ([str isEqualToString:string])
      return YES;
  }
  return NO; 
}
@end
6 голосов
/ 13 сентября 2012

Вы также можете использовать предикат:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF IN %@", theArray];
BOOL result = [predicate evaluateWithObject:theString];
5 голосов
/ 23 апреля 2010

за каждый объект

[(NSString *) [array objectAtIndex:i] isEqualToString:@"teststring"];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...