Как я могу получить индекс объекта в NSArray, используя строковое значение? - PullRequest
20 голосов
/ 04 февраля 2012

Я хочу получить индекс объекта в NSMutableArray категорий.

Объект категории имеет атрибут "category_title", и я хочу иметь возможность получить индекс, передав значение category_title.

Я просмотрел документы и не могу найти простой способ сделать это.

Ответы [ 3 ]

55 голосов
/ 04 февраля 2012

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");
    }
1 голос
/ 04 февраля 2012

Не уверен, что я понимаю вопрос, но что-то вроде этого может сработать (при условии, что Mutable Array содержит объекты класса "Category"):

int indx;
bool chk;
for (Category *aCategory in theArray) 
{
    chk = ([[aCategory category_title] isEqualToString:@"valOfCategoryTitle"])
    if ( chk )
        indx = [theArray indexOfObject:aCategory];
}
0 голосов
/ 04 февраля 2012

Попробуйте этот код гораздо проще: -

int f = [yourArray indexOfObject:@"yourString"];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...