2011-12-02 26 views
5

Cocoa define las clases de predicados (NSPredicate, NSExpression, etc.) que "proporcionan un medio generales de especificar consultas en Cocoa"Predicate Programming. Este conjunto de clases describe lo que necesito, pero con un pequeño inconveniente: me gustaría tener operadores adicionales.subclases NSPredicate para agregar operador

NSComparisonPredicate ya maneja 14 operadores (NSPredicateOperatorType) pero me gustaría añadir, por ejemplo, los operadores temporales ... u operadores para representar cosas como:

  • "variablestiene al menosnentradas "(operador binario)
  • " variable detienevalorde, como máximo,ndías consecutivos "(operador ternario)

Obviamente, habría que poner en práctica éstos mismo y el modelo de datos en los que este tipo de consultas se realizarán tendrán que apoyar a estos operadores. Pero, ¿hay alguna forma de implementarlo y beneficiarse de las clases NSPredicate existentes? Como los operadores se definieron como enum, dudo que pueda extenderme en ese frente. ¿O estoy extrañando el bote en esto?

Respuesta

7

HavingspentalotoftimeplayingaroundwithNSPredicate, no estoy seguro de que esta es la mejor idea.

En teoría, tendría subclase NSPredicate, crear su nueva inicializador y propiedades, y luego se reemplaza el método -evaluateWithObject:substitutionVariables: hacer su comparación personalizada.

Prácticamente, es probablemente mucho más difícil que eso.

En su lugar, podría considerar el uso de FUNCTION(). I wrote a blog post about FUNCTION hace un tiempo y cómo funciona con NSExpression y por lo tanto con NSPredicate. Personalmente, probablemente iría con esto, porque aún podrías usar la sintaxis +predicateWithFormat: para crear el NSPredicate. Crear una subclase para agregar un operador necesariamente evitaría que use el analizador incorporado.

+0

¡Tengo muchas lecturas para hacer! ¡Gracias! :) –