В настоящее время я создаю приложение в Swift 4.2, в котором я хотел бы использовать функцию фильтрации, которая позволяет пользователю выбирать несколько фильтров.
У меня есть массив выбранных в данный момент фильтров, например["Низкий", "Непрочитанный"].У меня также есть массив объектов, которые фильтруются.Но я изо всех сил пытаюсь выяснить, как применить несколько фильтров к этому массиву, особенно из-за того, что у объектов есть дочерние элементы, которые, в свою очередь, имеют свойства, которые фильтруются.Например, в массиве объектов содержится bulletin.importance.name, свойство, с которым будет проверяться значение «Low».
Следующий код представляет собой логическую функцию возврата, которая получит фильтры, которые будут использоваться в массиве бюллетеня.objects:
return (bulletin.bulletinVersion?.issued == true) && (scopes.contains("All") || (scopes.contains((bulletin.bulletinVersion?.bulletin?.importance?.name)!) ||
(!scopes.contains(where: {$0 == "Low" || $0 == "Normal" || $0 == "High"}))) && (scopes.contains(bulletin.read(i: bulletin.firstReadDate)) ||
(!scopes.contains(where: {$0 == "Unread"}))) &&
(scopes.contains(bulletin.signed(i: bulletin.signDate)) && bulletin.bulletinVersion?.bulletin?.requiresSignature == true) && scopes.contains(bulletin.favourited(i: bulletin.favourite)))
Это моя текущая попытка логической проверки.Я хочу, чтобы он был жестко установлен, поэтому, если пользователь выберет «Высокий» и «Непрочитанный», он будет показывать только объекты, которые соответствуют обоим этим фильтрам.
Функция вызывается здесь, получая фильтры и фильтруямассив ВСЕХ бюллетеней, в которые должны быть показаны, основываясь на фильтрах:
currentBulletinArray = bulletinArray.filter({bulletin -> Bool in
let doesCategoryMatch = getScopeFilters(issued: true, scopes: scope, bulletin: bulletin, signature: true)
if searchBarIsEmpty(){
return doesCategoryMatch
} else {
return doesCategoryMatch && (bulletin.bulletinVersion?.bulletin?.name?.lowercased().contains(searchText.lowercased()))!
}
})
Я хочу иметь возможность установить любую комбинацию фильтров, где возвращаемый предикат .filter будет показывать только бюллетени, которые соответствуют ВСЕМфильтры.Таким образом, непрочитанные + неподписанные + высокие будут показывать все бюллетени высокой важности там, где они не прочитаны и не подписаны.