2013-03-06 2 views
0

У меня есть объект Data Data Data с атрибутом ID. Я хочу, чтобы найти все объекты Field для ID == 1, 2 или 3.NSPredicate с NSArray NSNumbers (основные данные)

Как я могу добавить массив в NSPredicate ж/из создания долго прилагаемую строку что-то вроде:

NSArray *IDArray = @[@1, @2, @3]; 

NSMutableString *predicateString = [NSMutableString string]; 

for (NSNumber *ID in IDArray) { 
    [predicateString appendString:[NSString stringWithFormat:@"ID == %@, ID]]; 
} 
+0

Как примечание - нормальное соглашение Objective-C имеет экземпляр и локальные переменные начинаются с строчной буквы. Это упрощает чтение фрагментов кода для других людей. – Monolo

+0

xCode будет считать, что 'id' - тип класса. И я был под впечатлениями аббревиатур, которые должны быть капитализированы? Я думаю, что IDArray имеет смысл для меня. Должен ли я переименовать, чтобы имя не начиналось с заглавной аббревиатуры, например 'arrayOfIDs'? – Padin215

+0

Это вопрос личного вкуса, я верю. Я признаю, что набираю его как «идентификатор» или «идентификатор», что делает компилятор счастливым. – Monolo

ответ

2

Этом должно работать:

NSArray *IDArray = @[@1, @2, @3]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ID IN %@", IDArray]; 

Примечание: Вы никогда не должны использовать функции форматирования строки объединить предикаты. Использовать

[NSCompoundPredicate orPredicateWithSubpredicates:...] 

и аналогичные методы. Причина в том, что строки и предикаты имеют разные правила, по которым расширяются спецификаторы формата.

+0

Хорошо, я видел, что это использовалось со струнами, я не был уверен, что это сработает и для NSNumbers, спасибо! – Padin215

+0

@ Log139: Он работает, даже если атрибут имеет тип Integer, а массив содержит строки: типы преобразуются по мере необходимости. - Пожалуйста, подумайте о том, чтобы «принять» ответ, если он помог, спасибо. –

+0

Я попытался принять первый раз, сказал мне подождать 30 секунд, чтобы снова начать кодирование и забыл вернуться, чтобы принять = D – Padin215