【问题标题】:How can I perform an NSArray filteredArrayUsingPredicate where the predicate is a method?如何在谓词是方法的情况下执行 NSArray filteredArrayUsingPredicate?
【发布时间】:2011-03-20 10:51:52
【问题描述】:

如何在谓词是方法的情况下执行 NSArray filteredArrayUsingPredicate?这就是一个简单的代码示例在这里的样子?

我一直在尝试通过谓词 doco 并且有点困惑。我可以看到它是如何进行简单检查的,但是如果我有一个检查需要几行 Objective-c 代码来有效地实现代码的样子:

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

谢谢

【问题讨论】:

    标签: iphone objective-c nsarray nspredicate predicate


    【解决方案1】:

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

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

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

    【讨论】:

    • 太棒了 - 我已经做了一些 Ruby,所以很高兴听到 Objective-c 可以支持这个
    【解决方案2】:

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

    [NSPredicate predicateWithFormat:@"FUNCTION(SELF, 'mySuperMethod:', %@)", aParameter];
    

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

    • SELF 将迭代地成为数组中的每个项目
    • 数组中的每个项目都会调用其-mySuperMethod: 方法
    • -mySuperMethod: 将接收 aParameter 作为方法的参数
    • -mySuperMethod: 将返回一个 BOOL 已装在 NSNumber
    • -mySuperMethod: 返回YES 的所有对象都将包含在过滤后的数组中。

    有关此语法的更多信息,请查看this blog post

    那么为什么要使用这种方法而不是块方法呢?我能想到两个原因:

    • 向后兼容性
      • 如果您需要在 Leopard 上使用此功能(Mac 上的块已在 Snow Leopard 中引入)。
      • 如果您需要它在 iOS 4.0 之前的版本上工作(iOS 上的块是在 iOS 4.0 中引入的)。
    • 您希望序列化谓词以供存档和以后检索。这很好,只要aParameter 符合<NSCoding> 协议。块不能被序列化。

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

    【讨论】:

    • 那是为了指出这一点 - 不确定将哪个标记为正确答案,指出两者都很好 - 最后用第一个答案指出你的最后一句话
    猜你喜欢
    • 2014-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    相关资源
    最近更新 更多