Как проверить, есть ли в массиве NSMutableArray (__bridge id) объект в массиве

Я пытаюсь добавить элемент ABRecordRef в мой NSMutableArray. Только что узнал, что необходимо преобразовать C TypeDef в идентификатор типа Objective-C, используя (_bridge id). Поэтому, прежде чем добавлять новые элементы в массив, я хочу проверить, находится ли объект уже в массиве. Поэтому я попытался использовать [nsmutablearray containsObject], но, похоже, он не работает. Дублирующиеся элементы все еще добавляются в массив. Вы знаете, что здесь может быть не так?

-(BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person{
    if (![_buddiesList containsObject:(__bridge id)person]) {
        [_buddiesList addObject:(__bridge id)person];
        NSLog(@"Added");
    }
    return NO;
}

3 ответа

Решение

Нет NS-эквивалента ABRecordRef а также -containsObject: просто звонит -isEqual: по всем его объектам определить, есть ли уже дубликат, или нет, поэтому ваш подход не может работать.

Я предлагаю написать класс обертки вокруг ABRecordRef и реализовать свой собственный -isEqual: метод там.

Обновить:
Как отмечает @omz, это работает, потому что CFEqual() называется, спасибо! Однако использование класса-обертки вокруг ABRecordRef все еще является хорошей идеей.

Причина ваша containsObject: вызов не может сообщить, что дубликат NSArray использует NSObject метод -isEqual: определить равенство и типы CF, такие как ABRecordRef нет этого метода. Нам нужно найти лучший способ определить равенство.

Наиболее эффективный способ сделать это - использовать оболочку Objective-C вокруг API AddressBook, превращая каждую запись в добросовестный NSObject вместо того, чтобы просто навести мост. Проект iPhoneContacts Джима Дови является хорошо написанным решением для этого. Чтобы построить метод тестирования на равенство, просто добавьте isEqual: метод, который использует метод, показанный ниже для сравнения идентификаторов записей.

Кроме того, вы можете оставить все как есть, но выполнять линейное сканирование массива каждый раз, когда собираетесь добавить запись. Что-то вроде этого:

BOOL foundMatch = NO;
for(id buddy in self.buddiesList)
{
    if(ABRecordGetRecordID(buddy) == ABRecordGetRecordID(person))
    {
        foundMatch = YES;
        break;
    }
}

Вы можете попробовать проверить ваши объекты массива против isKindOfClass.

Например:

if ([[buddiesList objectAtIndex: i] isKindOfClass: (_bridge id) person]) {

Делай что-нибудь;

}

Другие вопросы по тегам