Seb*_*ian 5 predicate core-data nsfetchrequest swift
在 Swift 4 中,我有一个 CoreData“Sentence”模型,它有一个字符串属性“englishsentence”。我还有一个“单词”数组,并希望获取“englishsentence”属性包含数组中一个或多个单词的所有句子。
var words = ["today", "yesterday", "tomorrow"]
Run Code Online (Sandbox Code Playgroud)
这个数组只是一个例子。它应该在运行时改变并且可以有任何长度。
在 fetch 请求中,我试图做这样的事情:
let fetchRequest =
NSFetchRequest<NSManagedObject>(entityName: "Sentence")
let predicate = NSPredicate(format: "ANY englishsentence CONTAINS ANY word IN %@", words)
fetchRequest.predicate = predicate
Run Code Online (Sandbox Code Playgroud)
我能够为包含一个特定单词的所有句子创建一个谓词。但是,我无法让它与单词数组一起工作,除非我遍历单词数组并为每个单词发出新的获取请求。但这似乎非常低效。
一种选择是创建一个“复合谓词”:
let words = ["today", "yesterday", "tomorrow"]
let predicates = words.map {
NSPredicate(format: "englishsentence CONTAINS %@", $0)
}
let predicate = NSCompoundPredicate(orPredicateWithSubpredicates: predicates)
Run Code Online (Sandbox Code Playgroud)
另一种选择是匹配正则表达式:
let regex = ".*(" + words.map {
NSRegularExpression.escapedPattern(for: $0)
}.joined(separator: "|") + ").*"
let predicate = NSPredicate(format: "englishsentence MATCHES %@", regex)
Run Code Online (Sandbox Code Playgroud)
要仅匹配“整个单词”,您可以添加单词边界模式\b:
let regex = ".*\\b(" + words.map {
NSRegularExpression.escapedPattern(for: $0)
}.joined(separator: "|") + ")\\b.*"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1916 次 |
| 最近记录: |