Swift Realm使用Array过滤List属性

我在我的Realm对象中有这个属性

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

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

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

 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”的标记?

任何帮助都非常感谢。

使用Realm谓词无法实现目标,因为Realm使用Predicates有很多限制,缺少处理计算属性的能力但你可以用这种方式作为workarround

  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()我们获取了标签数组并将其转换为字符串数组然后我们对字符串数组进行排序(这将确保只关注数组中的TAGS而不是顺序)然后我们在String中转换那个排序数组,例如你的tags.tagName数组是[“B”,“A”,“C”]然后你将得到“ABC”为STRING

之后我们检查STRING是否包含你的filterList.sorted()。joined()与之前解释过的相同的过程

所以,如果您的filterList有[“B”,“C”,“A”],您将获得“ABC”

我们检查“ABC”是否包含“ABC”,如果是,则包括在最终结果中