我的代码如下:
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”感到困惑吗?我如何实现目标?
答案 0 :(得分:1)
尝试[NSPredicate predicateWithFormat:@"NOT (title IN %@.title)", prev_set]
。
您的谓词假设prev_set
包含NSString
个对象,但根据您的描述,它包含只有字符串 property 的对象,因此它永远不会包含标题他们自己。我希望这是有道理的。
答案 1 :(得分:0)
根据定义,从A
移除两组B
和A
的交集是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)