2013-04-07 40 views
0

您好我使用NSSet的objectsPassingTest方法創建一個通用集合。有沒有一種方法可以使用NSPredicate編寫此代碼?我想要更多的測試來比較,而不僅僅是看一個集合是否包含對象。如何使用NSPredicate編寫此NSSet測試?

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

兩組含有NSString的,我想用一些諸如

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

謝謝!

+0

如果'userMusicTitles'是一組字符串,'userMusicTitles.title'是什麼?你能否更詳細地解釋這些集合包含什麼樣的對象以及預期的結果是什麼? – 2013-04-07 14:11:49

+0

是的,他們是字符串。我想看看friendMusicTitles中的每個字符串是否也在userMusicTitles中,並創建一個包含常用標題的集合。但是我想比較比嚴格的stringIsEqual或contains對象有點模糊,因此LIKE和[cd]要求。 – 2013-04-07 14:13:45

+0

我還不明白應該如何比較字符串。什麼是「有點模糊」?你能舉出具體的例子嗎? – 2013-04-07 14:42:20

回答

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中,該集合最後將包含您的元素。

+0

輝煌。完美的作品。謝謝。 – 2013-04-07 15:15:30

+1

我不會使用'LIKE',因爲它會解釋「*」和「?」作爲通配符。也許更好'= [cd]'或'CONTAINS [cd]'。 – 2013-04-07 15:16:57

+0

@ JasonC.Howlin謝謝。有趣的是,我在研究這個問題的同時學習了謂詞中的SELF事物。 – 2013-04-07 15:18:00