如何在谓词是方法的情况下执行NSArray filteredArrayUsingPredicate?

Gre*_*reg 4 iphone predicate objective-c nsarray nspredicate

如何在谓词是方法的情况下执行NSArray filteredArrayUsingPredicate?这就是一个简单的代码示例在这里看起来像什么?

我一直试图通过谓词doco并且有点困惑.我可以看到它对于简单检查是如何工作的,但是如果我有一个需要几行objective-c代码的检查来实现代码有效的代码:

  • 使用filteredArrayUsingPredicate过滤NSArray
  • 谓词将是一种方法,它以某种方式获取输入变量,执行任何检查和平衡,然后返回TRUE/FALSE作为返回值re是否应该过滤项目

谢谢

lxt*_*lxt 7

只要您使用iOS 4.0及更高版本,您就会很高兴知道这非常简单(以下内容不适用于3.x).

您可以使用该predicateWithBlock方法创建一个NSPredicate,它接受一个返回YES或NO作为其参数的块.所以你想要的正是如此(如果你不熟悉块,它们基本上是一种封装方法的方法.请看这里:http://pragmaticstudio.com/blog/2010/7/28/ios4-blocks- 1)

+ (NSPredicate *)predicateWithBlock:(BOOL (^)(id evaluatedObject, NSDictionary *bindings))block


Dav*_*ong 6

您可以使用predicateWithBlock:@lxt建议的方法,也可以使用该FUNCTION方法.这可以让你构建一个如下所示的谓词:

[NSPredicate predicateWithFormat:@"FUNCTION(SELF, 'mySuperMethod:', %@)", aParameter];
Run Code Online (Sandbox Code Playgroud)

如果使用该谓词过滤数组,则:

  • SELF 将迭代地成为数组中的每个项目
  • 数组中的每个项都将-mySuperMethod:调用其方法
  • -mySuperMethod:将接收aParameter作为方法的参数
  • -mySuperMethod:将返回一个BOOL 已装箱的NSNumber "这是非常重要的
  • 所有返回的对象的YES-mySuperMethod:将被包括在过滤阵列英寸

有关此语法的更多信息,请查看此博客文章.

那么为什么你想在块方法上使用这种方法呢?我可以想到两个原因:

  • 向后兼容性
    • 如果你需要这个在Leopard上工作(Mac上的块是在Snow Leopard中引入的).
    • 如果你需要这个在4.0之前的版本上工作(在iOS 4.0中引入了iOS上的块).
  • 您希望序列化谓词以进行存档和以后的检索.只要aParameter符合<NSCoding>协议,这就没问题.块无法序列化.

但是,如果这些都不是要求,那么从长远来看,块方法可能会更好,因为它更明显和可读.:)