我试图按属性值过滤对象数组
queryDatasource = datasource.filter {
if (!values.users.isEmpty && values.users.contains($0.User.User)) {
return true
}
if (!values.categories.isEmpty && values.categories.contains($0.Category.Category)) {
return true
}
if (!values.priorities.isEmpty && values.priorities.contains($0.Priority.Priority)) {
return true
}
if (!values.statuses.isEmpty && values.statuses.contains($0.Status.Status)) {
return true
}
return false
}
当我只选择一位用户Sara
时,它按预期工作,我只看到Sara
的结果。
当我选择第二个用户Mike
时,它仍然按预期工作,只有Mike
和Sara
的结果。
现在,如果我添加了优先级过滤器High
,它将按Mike
和Sara
返回所有对象。优先级为High
的所有对象都会忽略用户(我得到的)用户Dave
的高优先级对象(非预期)
简而言之,我想按User
AND Priority
和Category
或Status
进行过滤。如果它在用户过滤器中,则必须匹配
答案 0 :(得分:2)
我将逐步到达解决方案,向您展示我是如何到达那里的。
首先,删除所有不必要的!values.x.isEmpty
检查。如果序列为空,contains(_:)
将始终返回false,因此我们不需要担心它。此外,我将从谓词中删除所有不必要的包围:
queryDatasource = datasource.filter {
if values.users.contains($0.User.User) {
return true
}
if values.categories.contains($0.Category.Category) {
return true
}
if values.priorities.contains($0.Priority.Priority) {
return true
}
if values.statuses.contains($0.Status.Status) {
return true
}
return false
}
从这里开始,我们可以更好地将其识别为or
操作,所以让我们明确地重写它:
queryDatasource = datasource.filter {
return values.users.contains($0.User.User)
|| values.categories.contains($0.Category.Category)
|| values.priorities.contains($0.Priority.Priority)
|| values.statuses.contains($0.Status.Status)
}
如果我们可以使用or
(||
),显然我们可以切换到and
(&&
):
queryDatasource = datasource.filter {
return values.users.contains($0.User.User)
&& values.categories.contains($0.Category.Category)
&& values.priorities.contains($0.Priority.Priority)
&& values.statuses.contains($0.Status.Status)
}