过滤境界与斯威夫特
我总是试图使用NSPredicate
筛选我的境界数据库时出现以下错误。这是我已经试过:过滤境界与斯威夫特
let realm = try! Realm()
let predicate = NSPredicate(format: "typez.text.filter = 'special'")
let filterThis = realm.objects(Publication).filter(predicate)
print(filterThis)
我的模型类的相关部分是:
class Publication: Object, Mappable {
dynamic var id: Int = 0
var typez = List<getType>()
dynamic var url: String?
}
class getType: Object, Mappable {
dynamic var text: String = ""
}
我不经常使用NSPredicate的直接,而不是我做的过滤器中内嵌谓词关闭参数中。
let realm = try! Realm()
//Array of publications
let realmObjects = realm.objects(Publication)
//any publication where .text property == special will be filtered. and filter out empty array
let filterThis = realmObjects.filter({ $0.getType.filter({ $0.text == "special" } != []) })
print(filterThis)
我推荐这[文章](https://www.weheartswift.com/higher-order-functions-map-filter-reduce-and-more /)来学习更多有趣的技巧,包括如何在filter/map/reduce中使用'$ 0.property'闭包语法 – NSGangster
给我出现以下错误:'不能用'((_) - > _')参数列表调用'filter'。当我将这个类设置为Equatable时,它表示这是一种冗余一致性。 – SoundShock
如果'.text'属性是一个字符串,则不需要使用equateable,因为字符串是可以等化的。尝试铸造。我会更新我的答案。 – NSGangster
你提到的模型类的相关部分看起来像这样:
class Publication: Object, Mappable {
dynamic var id: Int = 0
var typez = List<getType>()
dynamic var url: String?
}
class getType: Object, Mappable {
dynamic var text: String = ""
}
如果我理解正确的话,你想找到Publication
实例是在其typez
清单,text
条目等于special
。你可以表达为:
let realm = try! Realm()
let result = realm.objects(Publication).filter("ANY typez.text = 'special'")
print(result)
尝试之前,但得到了错误'包含数组属性的关键路径必须使用聚合操作'# – SoundShock
我的错误。你需要包含一个像ANY这样的修饰符来指定List中有多少个元素必须与包含的对象相匹配才能被视为匹配。我已经更新了答案。 – bdash
我不喜欢接受的答案在这里,因为它实际上并没有回答这个问题......但后来它比我意识到帮助了我。我现在将尽可能使用闭包而不是NSPredicates。这个问题的实际答案应该是@ NSGangster的答案的一个稍微修改版本:
let realm = try! Realm()
//Array of publications
let realmObjects = realm.objects(Publication)
//any publication where .text property == special will be filtered. and filter out empty array
let filterThis = realmObjects.filter({ $0.typez.filter({ $0.text == "special" } != []) })
print(filterThis)
..或者与之相近的东西。
但我所寻找的是有点不同。我需要一种方法来过滤多字字符串的确切单词,并且使用带有“CONTAINS”的NSPredicate将匹配任何包含的子字符串,例如,搜索“红色”会匹配“fred”。境界不支持“喜欢”或正则表达式还,所以使用封闭是我能得到工作的唯一的事:
//I was going for a "related terms" result for a dictionary app
let theResults = terms.filter(
{
//Looking for other terms in my collection that contained the
//title of the current term in their definition or more_info strings
$0.definition.components(separatedBy: " ").contains(term.title) ||
$0.more_info.components(separatedBy: " ").contains(term.title)
}
)
尽可能多的一天,我花了搜索,希望这可以帮助别人带一个类似的问题。
Realm自v2.1.2开始支持'LIKE'。另请注意,基于闭包进行过滤存在许多不利之处,如演示:性能和内存开销会变差,当Realm发生更改时,结果集合不会自动更新,而且您无法访问功能像通知。 – bdash
什么是您的'发布'对象实现? –
可以在这里找到:http://stackoverflow.com/questions/36835805/objectmapper-get-array-of-one-item-within-json – SoundShock