CoreData谓词获取包含数组中任何单词的每个句子

时间:2018-04-29 09:54:24

标签: swift core-data predicate nsfetchrequest

在Swift 4中,我有一个CoreData“Sentence”模型,它具有String属性“englishsentence”。我还有一个“单词”数组,并希望获取“englishsentence”属性包含数组中一个或多个单词的所有句子。

var words = ["today", "yesterday", "tomorrow"]

这个数组只是一个例子。它应该在运行时更改,可以有任何长度。

并且在获取请求中我尝试执行以下操作:

let fetchRequest =
    NSFetchRequest<NSManagedObject>(entityName: "Sentence")
let predicate = NSPredicate(format: "ANY englishsentence CONTAINS ANY word IN %@", words)
    fetchRequest.predicate = predicate

我能够为包含一个特定单词的所有句子创建谓词。但是,除非我遍历单词数组并为每个单词生成一个新的获取请求,否则我无法使用单词数组。但这看起来非常低效。

1 个答案:

答案 0 :(得分:4)

一种选择是创建“复合谓词:”

let words = ["today", "yesterday", "tomorrow"]

let predicates = words.map {
    NSPredicate(format: "englishsentence CONTAINS %@", $0)
}
let predicate = NSCompoundPredicate(orPredicateWithSubpredicates: predicates)

另一种选择是匹配正则表达式:

let regex = ".*(" + words.map {
    NSRegularExpression.escapedPattern(for: $0)
}.joined(separator: "|") + ").*"

let predicate = NSPredicate(format: "englishsentence MATCHES %@", regex)

要仅匹配“整个单词”,您可以添加单词边界模式\b

let regex = ".*\\b(" + words.map {
    NSRegularExpression.escapedPattern(for: $0)
}.joined(separator: "|") + ")\\b.*"