一尘不染

使用数组的Swift Realm过滤器列表属性

swift

我的Realm对象中有此属性

 var tags = List<Tag>()
 "tags": [
        {
            "tagId": "80069",
            "tagName": "A"
        },
        {
            "tagId": "80070",
            "tagName": "B"
        },
        {
            "tagId": "80071",
            "tagName": "C"
        },
        {
            "tagId": "80073",
            "tagName": "D"
        }
    ]

我有一个可以过滤掉标签的视图控制器。

所以我有几个按钮来切换过滤器。我所做的是为每个按钮的过滤器创建一个数组

var filteredList = [String]()

因此,如果我单击按钮A,它将把“ A”追加到filteredList数组,如果我单击按钮B,它将把“ B”追加到filteredList数组,依此类推

目前这是我的过滤谓词

let realmFilteredList = self.realm.objects(MyDTO.self).filter("ANY tags.tagName IN %@", self.filteredList)

但是,上述谓词给我的结果是错误的,因为如果我想过滤属性为“ A,B,C,D”(精确的ABCD)的标签,它将返回给我其他包含A,B,C的标签,或D。

如何在我的搜索谓词中获得带有精确“ A,B,C,D”的标签?

给予的任何帮助都将受到高度赞赏。


阅读 394

收藏
2020-07-07

共1个答案

一尘不染

使用Realm谓词无法实现目标,因为Realm使用时有很多限制,Predicates并且缺少处理计算属性的能力,但是您可以将这种方式用作工作环境

    let filterList = ["A","B"]
    let realmList = realmInstance?.objects(MyDTO.self)
    let filteredArray = Array(realmList!).filter({Array($0.tags).map({$0.tagName}).sorted().joined().contains(filterList.sorted().joined())})

在这里,Array($0.tags).map({$0.tagName}).sorted().joined()我们得到了标签数组,并使用map将其转换为字符串数组,然后对字符串数组进行排序(这将确保仅关系数组中的TAGS而不是顺序),然​​后将已排序的数组转换为字符串例如,您的tag.tagName数组是[“
B”,“ A”,“ C”],此后,您将获得“ ABC”作为STRING

之后,我们检查STRING是否包含您的filterList.sorted()。joined(),该过程与之前说明的相同

因此,如果您的filterList具有[“ B”,“ C”,“ A”],您将获得“ ABC”

并且我们检查“ ABC”是否包含“ ABC”(如果有的话)是否包含在最终结果中

2020-07-07