Key-Path для элемента свойства словаря объекта в предикате? - PullRequest
2 голосов
/ 22 сентября 2011

Короче говоря, я ищу правильный формат предиката для индексации в атрибут словаря на объекте.

У меня есть массив экземпляров myObject, каждый с атрибутом CPDictionary (NSMutableDictionary) extAttributes, и япытаясь разрешить фильтрацию на основе значений в extAttributes.Я определяю свой предикат следующим образом:

[CPPredicate predicateWithFormat:@"extAttributes[%K] like[c] %@",key,val]

Я не уверен, каким будет правильный путь ключа для этого.Читая документацию по NSPredicate, может показаться, что extAttributes [% k] может быть индексом в массиве, а не словарем.Я пробовал несколько вариантов, и это единственный, который не ошибается.При проверке результирующих объектов выражения в объекте предиката выглядят правильными.Тем не менее, он не имеет ожидаемого результата.

1 Ответ

3 голосов
/ 22 сентября 2011

Похоже, вы путаете ссылки на массивы и словари. Просто используйте ключевой путь (разделенные точками имена элементов) для ссылки на вложенные элементы или свойства объекта, концептуально что-то вроде этого:

[CPPredicate predicateWithFormat:@"%K like[c] %@", @"extAttributes.myNestedElementName", val];

Опять же, я не так хорошо знаком с капучино, поэтому я не уверен, что они сделали здесь что-то немного другое, но именно так это работает в Touch Cocoa и Cocoa.

EDIT

Для динамического вычисления ключа все, что вам нужно сделать, это составить строку пути к ключу:

 var keyPath = [CPString stringWithFormat:@"%@.%@", @"extAttributes", key];

Теперь вы можете создать предикат следующим образом:

[CPPredicate predicateWithFormat:@"%K like[c] %@", keyPath, val];

EDIT

Эквивалентный код в Cocoa / Cocoa touch будет:

NSString *keyPath = [NSString stringWithFormat:@"%@.%@", @"extAttributes", key];
[NSPredicate predicateWithFormat:@"%K like[c] %@", keyPath, val];
...