2014-10-06 2 views
-1

У меня есть словарь. Я пытаюсь что-то вродеИсключение предикатов в Cocoa ObjC

ANY student.project_code BEGINSWITH[cd] "N8" 

Ошибки выброшена является

не могут сделать операцию подстроки с чем-то, что не является строка (LHS = <null> ок = N8)

Проблема заключается в том, что некоторые из студентов не имеют кода проекта. Как я могу избавиться от этой ошибки?

+0

Можете ли вы изменить свою модель данных для хранения пустых строк вместо nil для студентов, у которых нет кода проекта? Это устранит проблему, поскольку все будет строкой. – Greg

+0

@PartiallyFinite фактически данные возвращаются с сервера. Следовательно, это невозможно. И здесь json напрямую преобразуется в словарь с использованием универсального класса. –

+0

Поскольку вы фактически не используете базу данных любого типа, вместо этого вы можете использовать предикат блока - производительность будет не медленнее, и вы получите полную мощность реального кода. – Greg

ответ

0

Вы можете использовать блочный предикат вместо:

NSPredicate *p = [NSPredicate predicateWithBlock:BOOL ^(id evaluatedObject, NSDictionary *bindings) { 
    return [((NSDictionary *)evaluatedObject)["@project_code"] hasPrefix:@"N8"]; 
}]; 

Блок предикаты похожи на нормальные предикаты, за исключением того, вместо оценки строки предиката в отношении каждого объекта, это просто вызывает пользовательский блок, который вы предоставляете, передавая его объект, который сейчас тестируется, и вы возвращаете YES, если объект соответствует вашим правилам, и NO в противном случае. Это дает вам гораздо большую гибкость, поскольку вы можете запускать любой код в своем блоке и не ограничиваться условиями в стиле SQL.

Вышеприведенный код создает предикат для фильтрации массива словарей, каждый из которых имеет ключ project_code (если ключ не существует, метод будет возвращать нуль, поэтому проверка будет ложной, что именно то, что вы хотите в любом случае).

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