Как бы я написал этот тест NSSet, используя NSPredicate?

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

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

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

Если userMusicTitles.title LIKE[cd] friendMusicTitles.title

Спасибо!

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, который в конце будет содержать ваши элементы.

Другие вопросы по тегам