Подклассы NSP предиката для добавления оператора - PullRequest
5 голосов
/ 03 декабря 2011

Какао определяет классы предикатов (NSPredicate, NSExpression и т. Д.), Которые "предоставляют общие средства определения запросов в Какао" Программирование предикатов .Этот набор классов описывает то, что мне нужно, но с одним небольшим недостатком: мне нужны дополнительные операторы.

NSComparisonPredicate уже обрабатывает 14 операторов ( NSPredicateOperatorType ), но я хотел быдобавьте, скажем, временные операторы ... или операторы для представления таких вещей, как:

  • " переменная имеет по крайней мере n записи" (бинарный оператор)
  • " переменная имеет значение для, самое большее, n дней подряд" (троичный оператор)

Очевидно, мне потребуется реализовать этиЯ и модель данных, по которой выполняются такие запросы, должны будут поддерживать этих операторов.Но есть ли способ реализовать это и извлечь выгоду из существующих классов NSPredicate?Поскольку операторы были определены как enum, я сомневаюсь, что смогу расширить этот фронт.Или я полностью скучаю по лодке на этом?!

1 Ответ

7 голосов
/ 03 декабря 2011

Имея потраченного лота из времени игры вокруг с NSPredicate, я не уверен, что это лучшая идея.

Теоретически , вы бы подкласс NSPredicate, создайте свой новый инициализатор и свойства, а затем переопределите метод -evaluateWithObject:substitutionVariables:, чтобы выполнить пользовательское сравнение.

Практически это, вероятно, намного сложнее, чем это.

Вы могли бы рассмотретьвместо этого используйте FUNCTION(). Я недавно написал в блоге сообщение о FUNCTION и о том, как он работает с NSExpression и, следовательно, с NSPredicate.Лично я, вероятно, согласился бы с этим, потому что тогда вы могли бы использовать синтаксис +predicateWithFormat: для создания NSPredicate.Создание подкласса для добавления оператора обязательно помешает вам использовать встроенный синтаксический анализатор.

...