NSPredicates和NSSets,如何在两组交集中拒绝事物?

时间:2013-08-08 00:33:23

标签: objective-c

我的代码如下:

NSPredicate* pred = [NSPredicate predicateWithFormat:@"(title IN %@)", prev_set];
NSSet* remainingSet = [goal_set filteredSetUsingPredicate:pred ];

其中prev_set和goal_set是两个不同的集合。两个集合中包含的对象的属性中的“title”。

我的目标是,如果之前已经达到目标(每个目标都有一个独特的标题),所有目标都会被拒绝。

如果我有一个类似“%@中的标题”的谓词,则会拒绝goal_set中的所有对象。如果我使用“NOT(”%@中的标题)“,那么goal_set中的任何对象都将被拒绝。

如果我打印出两组,我看到它们显然有一些(但不是全部)共同的对象(也就是说,它们的标题是相同的)。

我对NSPredicates使用“IN”感到困惑吗?我如何实现目标?

2 个答案:

答案 0 :(得分:1)

尝试[NSPredicate predicateWithFormat:@"NOT (title IN %@.title)", prev_set]

您的谓词假设prev_set包含NSString个对象,但根据您的描述,它包含只有字符串 property 的对象,因此它永远不会包含标题他们自己。我希望这是有道理的。

答案 1 :(得分:0)

根据定义,从A移除两组BA的交集是A中B的relative complement,也称为组差,即{{1} }}

幸运的是,A \ B具有您需要的设置操作,即NSMutableSet

minusSet:

当然,为了实现这一目标,您必须实施目标对象的NSMutableSet *mutableGoalSet = [goal_set mutableCopy]; [mutableGoalSet minusSet:prev_set]; isEqual方法,以便通过标题识别它们。 (相关:Best practices for overriding isEqual: and hash