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];