2013-04-07 1 views
0

Привет Я создаю общий набор, используя метод NassetPassingTest. Есть ли способ написать это с помощью NSPredicate? Я хочу, чтобы тест больше соответствовал, чем просто видеть, содержит ли один набор объект.Как я могу написать этот тест NSSet с использованием NSPredicate?

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

Два комплекта содержат NSStrings, и я хотел бы использовать что-то такое, как

Если userMusicTitles.title LIKE [кд] friendMusicTitles.title

Спасибо!

+0

Если 'userMusicTitles' - это набор строк, что такое' userMusicTitles.title'? Можете ли вы объяснить больше, какие объекты содержатся в наборах и каковы предполагаемые результаты? –

+0

Да, это строки. Я хочу, чтобы каждая строка в friendMusicTitles также находилась в userMusicTitles и создала набор, содержащий общие названия. Но я хочу, чтобы сравнение было немного пушистым, чем строгий stringIsEqual или содержит объект, следовательно, требования LIKE и [cd]. –

+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]. Вам нужно будет сохранить ваш NSString уже в форме [cd].

Другим вариантом будет цикл по одному набору и использование значения в предикате, а затем добавление результата в NSMutableSet, который в конце будет содержать ваши элементы.

+0

Блестящий. Работает отлично. Спасибо. –

+1

Я бы не использовал 'LIKE', потому что это интерпретирует« * »и«? ». в качестве подстановочных знаков. Возможно, лучше '= [cd]' или 'CONTAINS [cd]'. –

+0

@ JasonC.Howlin Спасибо. Это было интересно, я изучил вещь SELF в предикате, изучая эту проблему. –