使用数组的Swift Realm过滤器列表属性
我的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”的标签?
给予的任何帮助都将受到高度赞赏。
回答:
使用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”(如果有的话)是否包含在最终结果中
以上是 使用数组的Swift Realm过滤器列表属性 的全部内容, 来源链接: utcz.com/qa/401224.html