NSArray
не гарантирует, что вы можете сохранить только одну копию данного объекта, поэтому вы должны убедиться, что вы обрабатываете это самостоятельно (или используете NSOrderedSet
).
Тем не менее, здесь есть пара подходов. Если ваши объекты категории реализуют isEqual:
для соответствия category_title, то вы можете просто использовать -indexOfObject:
.
Если вы не можете этого сделать (поскольку объекты категории используют другое определение равенства), используйте -indexOfObjectPassingTest:
. Требуется блок, в котором вы можете выполнить любой тест, который хотите определить, чтобы определить свой «тест» - в этом случае тестируется category_title
равенство строк.
Обратите внимание, что все они объявлены для NSArray
, поэтому вы их не увидите, если посмотрите только заголовок / документацию NSMutableArray
.
РЕДАКТИРОВАТЬ: Пример кода. Это предполагает объекты класса CASCategory
со свойством NSString
categoryTitle
(я не могу заставить себя поставить подчеркивание в имени ивара: -):
CASCategory *cat1 = [[CASCategory alloc] init];
[cat1 setCategoryTitle:@"foo"];
CASCategory *cat2 = [[CASCategory alloc] init];
[cat2 setCategoryTitle:@"bar"];
CASCategory *cat3 = [[CASCategory alloc] init];
[cat3 setCategoryTitle:@"baz"];
NSMutableArray *array = [NSMutableArray arrayWithObjects:cat1, cat2, cat3, nil];
[cat1 release];
[cat2 release];
[cat3 release];
NSUInteger barIndex = [array indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
if ([[(CASCategory *)obj categoryTitle] isEqualToString:@"bar"]) {
*stop = YES;
return YES;
}
return NO;
}];
if (barIndex != NSNotFound) {
NSLog(@"The title of category at index %lu is %@", barIndex, [[array objectAtIndex:barIndex] categoryTitle]);
}
else {
NSLog(@"Not found");
}