Ответ 1
Вы можете попробовать это
NSPredicate *predicate = [NSCompoundPredicate orPredicateWithSubpredicates:@[p1, p2]];
Я пытаюсь создать NSPredicate с несколькими условиями. Я нашел несколько решений, но никто из них, похоже, не работает с моим методом. Самый лучший из них я нашел ниже.
Это мой единственный предикатный метод, и он отлично работает:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains[c] %@",
searchText];
filteredBusinesses = [businesses filteredArrayUsingPredicate:predicate];
Вот моя отредактированная версия с несколькими условиями. Я не уверен, что происходит не так. Любые идеи?
NSPredicate *p1 = [NSPredicate predicateWithFormat:@"name contains[c] %@", searchText];
NSPredicate *p2 = [NSPredicate predicateWithFormat:@"businessArea contains[c] %@",
searchText];
NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[p1, p2]];
filteredBusinesses = [businesses filteredArrayUsingPredicate:predicate];
Вы можете попробовать это
NSPredicate *predicate = [NSCompoundPredicate orPredicateWithSubpredicates:@[p1, p2]];
Дополнение к ответу @Nikunj, вы также можете использовать NSCompoundPredicate для ваших операций AND, как это.
Obj-C - AND
NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"X == 1"];
NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"X == 2"];
NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[predicate1, predicate2]];
Swift - И
let predicate1:NSPredicate = NSPredicate(format: "X == 1")
let predicate2:NSPredicate = NSPredicate(format: "Y == 2")
let predicate:NSPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [predicate1,predicate2] )
Swift 3 - AND
let predicate1 = NSPredicate(format: "X == 1")
let predicate2 = NSPredicate(format: "Y == 2")
let predicateCompound = NSCompoundPredicate.init(type: .and, subpredicates: [predicate1,predicate2])
В коде, который вы опубликовали, ничего не выглядит неправильно, что означает, что ошибка, вероятно, возникает, когда вы оцениваете предикат, фильтруя массив.
Поскольку первый предикат работает, проблема кроется в ключевом пути businessArea
.
Фильтрация массива приведет к исключению, если:
businessArea
(как, впрочем, это не объект, который имеет метод -businessArea
)businessArea
, но значение не является ни NSString
, ни nil