objective-c - 子类化 NSPredicate 以添加运算符

标签 objective-c cocoa nspredicate subclassing

Cocoa 定义谓词类(NSPredicateNSExpression 等)“提供了在 Cocoa 中指定查询的通用方法” Predicate Programming 。这组类描述了我的需要,但有一个小缺点:我想要额外的运算符。

NSComparisonPredicate 已经处理了 14 个运算符 ( NSPredicateOperatorType ),但我想添加,比如说,时间运算符……或运算符来表示诸如:

  • "变量 至少有 n "(二元运算符)
  • "变量 具有 至多, n 连续几天(三元运算符)

显然,我需要自己实现这些,并且执行此类查询的数据模型必须支持这些运算符。但是,有没有办法实现它并从现有的 NSPredicate 类中受益?由于运算符被定义为 enum,我怀疑我能否在这方面进行扩展。还是我完全错过了这艘船?!

最佳答案

Having spent a lot of time playing around with NSPredicate,我不确定这是不是最好的主意。

理论上,您可以子类化 NSPredicate,创建新的初始化器和属性,然后覆盖 -evaluateWithObject:substitutionVariables: 方法以进行自定义比较。

实际上,它可能比这要困难得多。

您可以考虑改用 FUNCTION()I wrote a blog post about FUNCTION前一段时间以及它如何与 NSExpression 一起玩,因此与 NSPredicate 一起玩。就个人而言,我可能会接受这个,因为那样你仍然可以使用 +predicateWithFormat: 语法来创建 NSPredicate。创建子类以添加运算符必然会阻止您使用内置解析器。

关于objective-c - 子类化 NSPredicate 以添加运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8362955/

相关文章:

objective-c - 动画 UICollectionView 单元格大小更改和重新定位周围单元格

ios - UIAppearance setTranslucent error : Illegal property type, c for appearance setter, _installAppearanceSwizzleForSetter

objective-c - 如何在 Cocoa 中运行另一个应用程序后运行我自己的应用程序?

objective-c - 将字符转换为 cocoa 或碳中的键代码

cocoa - 来自 AXUIElement 的 CGWindowID

ios - 将 NSPredicate 应用于字典 IOS 内的数组

ios - NSFetchRequest 和 NSPredicate,数组比较和匹配

ios - NSPredicate中的动态比较器

objective-c - Swift #available 关键字与respondsToSelector

ios - 对象计数 (1116) 与键计数 (1117) 不同