Key-Path для элемента свойства словаря объекта в предикате?

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

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

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

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

1 ответ

Решение

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

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

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

РЕДАКТИРОВАТЬ

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

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

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

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

РЕДАКТИРОВАТЬ

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

NSString *keyPath = [NSString stringWithFormat:@"%@.%@", @"extAttributes", key];
[NSPredicate predicateWithFormat:@"%K like[c] %@", keyPath, val];
Другие вопросы по тегам