Проблемы с использованием 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
,