predicateWithBlock: 中块的 bindings 参数是做啥用的?

Posted

技术标签:

【中文标题】predicateWithBlock: 中块的 bindings 参数是做啥用的?【英文标题】:What is the bindings parameter for the block in predicateWithBlock: used for?predicateWithBlock: 中块的 bindings 参数是做什么用的? 【发布时间】:2011-09-19 14:10:01 【问题描述】:

+[NSPredicate predicateWithBlock:] 的声明如下所示:

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

Apple 的关于该块的第二个参数 bindings 的文档说它是:

替换变量字典。字典必须包含接收器中所有变量的键值对。

我不知道为什么需要这个参数——我也没有看到它在任何地方被使用过。为什么会在那里?

另外,当使用带有 -[NSArray filteredArrayUsingPredicate:] 的基于块的谓词时,我是否需要查看 bindings 内部?

【问题讨论】:

这里有一个关于在何处以及如何使用 bindings 参数的示例的答案将非常有用! 【参考方案1】:

查看类文档:

您还可以创建包含变量的谓词,以便 谓词可以在替换具体值之前预先定义 运行。在 Mac OS X v10.4 中,对于使用变量的谓词, 评估是一个两步过程(见 predicateWithSubstitutionVariables: 和 evaluateWithObject:)。在 Mac 中 OS X v10.5 及更高版本,您可以使用 evaluateWithObject:substitutionVariables:,它结合了这些步骤。

然后查看predicate syntax docs。


如果您随后调用evaluateWithObject:substitutionVariables:,则该字典将传递给您的块。这样可以创建相当通用的谓词,其中可以传递结果谓词,并且可以使用一致的替换语言进行评估。

【讨论】:

当你定义一个字符串格式的谓词时,我可以看到替换变量的用处。但是我仍然不明白当您使用predicateWithBlock: 创建谓词时如何使用替换变量。 (一个例子会很棒) 啊,我现在明白你的意思了。此外,在创建谓词以传递给-[NSArray filteredArrayUsingPredicate:] 时是否使用了绑定参数?我的猜测不是。 @JulianF.Weinert 链接不再有效,您还有其他参考资料吗? 对不起,这个互联网有点愚蠢;)web.archive.org/web/20160330070114/http://www.wannabegeek.com/… 当然,archive.org 拥有一切! :D

以上是关于predicateWithBlock: 中块的 bindings 参数是做啥用的?的主要内容,如果未能解决你的问题,请参考以下文章

Smarty 模板:如何更改子模板中块的顺序?

text 铜中块的例子

ES6 中块的概念

cad的一个小技巧,通过块中块插入含有字段块,保证更新

NSFetchRequest 和 predicateWithBlock

NameNode对数据块的管理