2

我的代码如下所示:

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

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

我的目标是,如果之前已经实现的所有目标都将被拒绝(每个目标都有一个唯一的标题)。

如果我有诸如“%@ 中的标题”之类的谓词,goal_set 中的所有对象都将被拒绝。如果我使用“NOT(”title in %@)”,那么 goal_set 中的所有对象都不会被拒绝。

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

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

4

2 回答 2

1

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

您的谓词假定prev_set包含NSString对象,但根据您的描述,它包含仅具有字符串属性的对象,因此它永远不会包含标题本身。我希望这是有道理的。

于 2013-08-08T00:50:04.857 回答
0

根据定义,去除两个集合的交集ABfromA是 B 在 A 中的相对补集,也称为集合差,即A \ B

LucklyNSMutableSet具有您需要的集合操作,即minusSet:

NSMutableSet *mutableGoalSet = [goal_set mutableCopy];
[mutableGoalSet minusSet:prev_set];

当然,为此,您必须实现目标对象的方法isEqualhash方法,以使它们可以通过其标题进行识别。(相关:覆盖 isEqual: 和 hash 的最佳实践

于 2013-08-08T00:40:16.477 回答