我有一个可以过滤和排序的UITableView
。当用户选择一个过滤器选项时,我试图使用名为liftUuidPredicate
的lazy var
来构造谓词。用户的选择存储在UserDefaults
但如果没有选择的过滤器,也不会在UserDefaults.logFilterLiftUuid()
任何价值,这是导致我的应用程序错误崩溃:如何为NSPredicate创建一个可以返回零的惰性变量
NSInvalidArgumentException', reason: '*** -copyWithZone: cannot be sent to an abstract object of class NSPredicate: Create a concrete instance!
显然,我需要创建一个具体的NSPredicate的实例,但是当没有谓词时我不知道该怎么做。
// throws the 'Create a concrete instance' error
lazy var liftUuidPredicate: NSPredicate = {
guard let liftUuid = UserDefaults.logFilterLiftUuid() else { return NSPredicate() }
return NSPredicate(format: "uuid = %@", liftUuid)
}()
// fetchedResultsController
func fetchLiftEvents() -> NSFetchedResultsController<NSFetchRequestResult> {
let moc = stack.managedObjectContext
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "LiftEvent")
fetchRequest.predicate = liftUuidPredicate
if let sortBy = UserDefaults.logSortSelection() {fetchRequest.sortDescriptors = [NSSortDescriptor(key: sortBy, ascending: false)]}
fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: moc, sectionNameKeyPath: nil, cacheName: nil)
do {
try fetchedResultsController!.performFetch()
} catch {
fatalError("Unable to fetch Lift Events: \(error)")
}
return fetchedResultsController!
}
的NSPredicate()
可用的方法期望的格式和某种形式的参数(S)时,我希望这是没有断言这将不起作用。在guard let
声明中,我也试过return NSPredicate(value: false)
,但是,正如我预期的那样,fetchRequest并没有返回任何记录。
我该如何做这项工作?