我如何使用NSPredicate编写此NSSet测试?

时间:2013-04-07 14:00:55

标签: ios objective-c nspredicate nsset

您好我使用NSSet的objectsPassingTest方法创建了一个公共集。有没有办法用NSPredicate写这个?我想要更多的测试匹配,而不仅仅是看一个集合是否包含一个对象。

NSSet *commonMusic = [userMusicTitles objectsPassingTest:^BOOL(id obj, BOOL *stop) {
    return [friendMusicTitles containsObject:obj];
}];

这两个包含NSStrings,我想使用诸如

之类的东西

如果userMusicTitles.title LIKE [cd] friendMusicTitles.title

谢谢!

1 个答案:

答案 0 :(得分:1)

如果我找到你,你想要创建一个新的NSSet,它包含2个不同NSSet共有的所有元素。

- (void)testTest
{
NSArray *a = @[ @"boris", @"bob", @"claire", @"x" ];
NSArray *b = @[ @"Boris", @"BOB", @"vince", @"y", @"x" ];
NSSet *userMusicTitles = [NSSet setWithArray:a];
NSSet *friendMusicTitles = [NSSet setWithArray:b];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF LIKE[cd] $STR"];
__block NSPredicate *blockPredicate = nil;
NSSet *commonMusic = [userMusicTitles objectsPassingTest:^BOOL(NSString *obj, BOOL *stop) {
    blockPredicate = [predicate predicateWithSubstitutionVariables:@{ @"STR" : obj }];
    return ([friendMusicTitles filteredSetUsingPredicate:blockPredicate].count > 0);
}];

NSLog(@"common music == %@", commonMusic);
}

其他选择。

NSMutableSet使用- (void)intersectSet:(NSSet *)otherSet方法。但它不会做LIKE[cd]。您必须以[cd]格式存储NSString。

其他选项是循环遍历一个集合并使用谓词中的值,然后将结果添加到NSMutableSet,最后将包含您的元素。