NSPredicate过滤掉另一组中的所有项目

Gen*_*ari 5 objective-c nsset nspredicate ios

有没有办法做到这一点?我有一组项目,我想从另一组中排除.我知道我可以循环遍历我的集合中的每个项目,只将它添加到我的filteredSet中,如果它不在另一个集合中,但如果我可以使用谓词那么会很好.

要排除的项集不是直接相同类型的对象集; 这是一组字符串; 如果其中一个属性与该字符串匹配,我想从我的第一个集合中排除任何内容....换句话说:

NSMutableArray *filteredArray = [NSMutableArray arrayWithCapacity:self.questionChoices.count];

BOOL found;

for (QuestionChoice *questionChoice in self.questionChoices)
{
    found = NO;

    for (Answer *answer in self.answers)
    {
        if ([answer.units isEqualToString:questionChoice.code])
        {
            found = YES;
            break;
        }
    }

    if (!found)
        [filteredArray addObject:questionChoice];
}
Run Code Online (Sandbox Code Playgroud)

这可以用谓词来完成吗?

End*_*mic 6

这个谓词格式字符串应该工作:

@"NONE %@.units == code", self.answers
Run Code Online (Sandbox Code Playgroud)

将其与适当的NSArray过滤方法结合使用.如果self.questions是常规的不可变NSArray,它看起来就像

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NONE %@.units == code", self.answers]

NSArray *results = [self.questions filteredArrayUsingPredicate:predicate];
Run Code Online (Sandbox Code Playgroud)

如果它是NSMutableArray,则适当的用法是

[self.questions filterUsingPredicate:predicate];
Run Code Online (Sandbox Code Playgroud)

但要注意最后一个,它会修改现有数组以适应结果.您可以创建数组的副本并过滤副本以避免这种情况(如果需要).

参考:
NSArray类参考
NSMutableArray类参考
谓词编程指南