2014-02-06 2 views
-1

Я пытаюсь отфильтровать NSDictionary с использованием NSPredicate. Кажется, что есть ошибка.Фильтрация Nsdictionary с использованием nspredicate

Я это NSDictionary:

dict = [[NSDictionary alloc] initWithObjectsAndKeys:translation, @"trans", meaning, @"mean", pronounce, @"pron", theId, @"id", nil]; 

Я хочу, чтобы фильтровать этот словарь. Если значение id ключа в словаре равно passedId, добавить его в NSArray:

Я использую следующий код:

NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"theId == %@", passedId]; 
NSArray *requiredRows = [[dict allKeys] filteredArrayUsingPredicate:filterPredicate]; 

дает мне эту ошибку:

'NSUnknownKeyException', reason: '[<__NSCFConstantString 0xada8> valueForUndefinedKey:]: this class is not key value coding-compliant for the key theId. 
+0

@iMani, а как насчет первой строки кода? – vikingosegundo

ответ

0

Ваш ключ: id:

theId, @"id", 

Таким образом, ваш предикат использует неправильный ключ. Это должно быть:

[NSPredicate predicateWithFormat:@"id == %@", passedId] 

потому что ключ в словаре и предикат должен совпадать.


Первоначально я изначально не замечал, что вы используете [dict allKeys]. Это получает массив всех ключей из одного словаря. Там нет значений, и нет никакой фильтрации.

У вас должен быть массив словарей и работать с предикатом этого массива. Тогда результат будет содержать только словари, которые соответствуют id.

+0

Этот класс не является ключевым значением, совместимым с кодом для идентификатора ключа. ' – user3258468

0

Ваш код не имеет никакого смысла. Разделить его на несколько строк, чтобы сделать его очевидным:

NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"theId == %@", passedId]; 
NSArray *allKeys = [dict allKeys]; 
NSArray *requiredRows = [allKeys filteredArrayUsingPredicate:filterPredicate]; 

AllKeys является массивом NSStrings, и это выглядит как этот @"id", @"mean", @"pron", @"trans". Вы не можете отфильтровать это для @"theId", потому что фильтрация будет в основном вызывать [NSString theId] для каждой NSString, и результат этого метода будет сравниваться со строкой, указанной вами в предикате. Вот откуда исходит исключение, NSString не имеет метода с именем theId.

И даже если это будет работать, потому что вы используете self == %@ в качестве предиката, единственным результатом, который вы получите, будет @"theId".

Я не уверен, что вы действительно хотите, но это не сработает.

Смежные вопросы