如何使用"empty"谓词创建 NSCompound谓词



我试图通过NSCompoundPredicate将更多的单个谓词组合成一个谓词,但可能会出现一个或多个谓词没有被构造的情况,因为所有对象都应该从CoreData实体中检索(因此实际上不需要谓词(。

if isGenreFilterOn {
genrePredicate = NSPredicate(format: "genID == (genreID)")
}
if searchFor != "" {    
bookPredicate = NSPredicate(format: "bokName CONTAINS[cd] %@", searchFor)
}
let predicate = NSCompoundPredicate(type: .and, subpredicates: [genrePredicate, bookPredicate])

如果未构造任何谓词,则应用程序将失败。避免许多if子句的最佳方法是什么?我应该构造谓词来检索实体中的所有对象吗?或者有什么聪明的方法吗?谢谢

您可以动态构建一个只包含所需谓词的数组,而不是创建"空"谓词:

var predicates = [NSPredicate]() // Start with empty list.
if isGenreFilterOn {
// Add genre predicate:
predicates.append(NSPredicate(format: "genID == (genreID)"))
}
if !searchFor.isEmpty {
// Add book predicate:
predicates.append(NSPredicate(format: "bokName CONTAINS[cd] %@", searchFor))
}
// ... more criteria ...
// Combine all predicates:
let predicate = NSCompoundPredicate(type: .and, subpredicates: predicates)

可以轻松添加更多可选(或非可选(标准。即使谓词数组为空,这也能正常工作。


备注:注意谓词格式字符串中的字符串插值。

NSPredicate(format: "genID == (genreID)")

如果genreID是一个数字,则它是可以的,但如果它是一个字符串并且包含任何特殊字符或谓词的保留关键字,则可能在运行时崩溃。

您所调用的空谓词总是计算为"true"。您可以做到这一点——当您不需要任何一个谓词时,使用NSPredicate(value: true)来代替它们。使用一个始终为真的谓词,您的复合词将评估另一个谓词。如果两者都是真的,那么复合词总是真的,这与没有谓词是一样的。

最新更新