我试图通过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)
来代替它们。使用一个始终为真的谓词,您的复合词将评估另一个谓词。如果两者都是真的,那么复合词总是真的,这与没有谓词是一样的。