Проблемы с использованием NONE при фильтрации NSArray с помощью NSSet

Я пытаюсь отфильтровать NSArray, исключив элементы, которые находятся в NSSet. Я делаю что-то вроде этого:

    NSMutableArray* a = [NSMutableArray arrayWithObjects:@"1", @"2", @"3", nil];
    NSSet* set = [NSSet setWithObjects:@"2", nil];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NONE SELF IN %@", set];
    NSArray* b = [a filteredArrayUsingPredicate:predicate];

Однако этот код вызывает исключение:

Завершение работы приложения из-за необработанного исключения "NSInvalidArgumentException", причина: "Левая часть оператора ALL или ANY должна быть NSArray или NSSet

Что это я делаю не так?

1 ответ

Решение

Вы должны использовать NOT вместо NONE в предикате:

[NSPredicate predicateWithFormat:@"NOT SELF IN %@", set]

Это потому, что предикат применяется к каждому объекту (SELF) в массиве, который NSString, Напротив, None следует применять на NSArray из NSSet,

Если вы настаиваете на использовании NONE, Вы можете изменить a в

NSMutableArray* a = [NSMutableArray arrayWithObjects:@[@"1"], @[@"2"], @[@"3"], nil];

таким образом SELF становится NSArray,

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