Как проверить, есть ли в массиве 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]) {
Делай что-нибудь;
}