【发布时间】:2019-03-21 00:48:39
【问题描述】:
我目前正在 Swift 4.2 中创建一个应用程序,我想要一个允许用户选择多个过滤器的过滤功能。
我有一个当前选择的过滤器数组,例如 ["Low", "Unread"]。我还有一组被过滤的对象。但我正在努力弄清楚如何对这个数组应用多个过滤器,特别是因为对象有子对象,而子对象又具有被过滤的属性。例如,对象数组包含 bulletin.importance.name,这是检查“低”的属性。
以下代码是一个布尔返回函数,它将获取要在公告对象数组上使用的过滤器:
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 谓词将仅显示与所有过滤器匹配的公告。 因此,未读 + 未签名 + 高将显示所有未读和未签名的高重要性公告。
【问题讨论】:
-
您可以从pastebin.com/VFi1mFyT 开始吗?您可以为
bulletin创建方法来管理已经存在的一些案例,这应该可以减轻您的长时间测试。 -
@Larme 这非常有用。谢谢你。我现在重新整理一下。使用辅助函数测试每个布尔值,我将如何将它们连接在一起以确保每个公告都遵守每个检查?
-
我注意到公告具有公告版本,而公告版本又具有其他公告。你能展示一些关于这些对象如何关联的屏幕截图吗?这些是 Core Data 对象吗?
-
您是否要求实现
getScopeFilters方法来替代那个庞大的布尔语句集群?或者getScopeFilters方法是否会是该布尔语句网络的“补充”? -
@JacobBarnard 发布,我希望它足够详细,可以看到我在哪里进行了设计更改。
标签: ios swift filter boolean predicate