2011-12-02 3 views
5

Cocoa définit les classes sous-jacentes (NSPredicate, NSExpression, etc.) qui "fournissent un moyen général de spécifier des requêtes à Cocoa"Predicate Programming. Cet ensemble de classes décrit ce dont j'ai besoin mais avec un peu de retard: j'aimerais des opérateurs supplémentaires.Subclassing NSPredicate pour ajouter opérateur

NSComparisonPredicate gère déjà 14 opérateurs (NSPredicateOperatorType) mais je voudrais ajouter, par exemple, les opérateurs temporels ... ou les opérateurs de représenter des choses telles que:

  • "variablesa au moinsnentrées "(opérateur binaire)
  • " variablesavaleurpour, au plus,njours consécutifs "(opérateur ternaire)

De toute évidence, je aurais besoin de mettre en œuvre ces moi-même et le modèle de données sur lesquelles ces requêtes sont effectués devront soutenir ces opérateurs. Mais existe-t-il un moyen de l'implémenter et de tirer parti des classes NSPredicate existantes? Puisque les opérateurs ont été définis comme enum, je doute que je puisse étendre sur ce front. Ou suis-je complètement manquer le bateau sur ce ?!

Répondre

7

HavingspentalotoftimeplayingaroundwithNSPredicate, je ne suis pas sûr que ce soit la plus grande idée.

En théorie, vous seriez sous-classe NSPredicate, créez votre nouveau initialiseur et les propriétés, puis substituez la méthode -evaluateWithObject:substitutionVariables: pour faire votre comparaison personnalisée.

Pratiquement, c'est probablement beaucoup plus difficile que ça.

Vous pouvez utiliser FUNCTION() à la place. I wrote a blog post about FUNCTION il ya un certain temps et comment il joue avec NSExpression et donc avec NSPredicate. Personnellement, je serais probablement aller avec cela, car alors vous pouvez toujours utiliser la syntaxe +predicateWithFormat: pour créer le NSPredicate. Créer une sous-classe pour ajouter un opérateur vous empêchera nécessairement d'utiliser l'analyseur intégré.

+0

J'ai beaucoup de lecture à faire! Je vous remercie! :) –