私はUITableView
をフィルタリングおよびソートできます。ユーザーがフィルターオプションを選択すると、liftUuidPredicate
というlazy var
を使用して述部を構成しようとしています。ユーザの選択はUserDefaults
に格納されているが、選択されたフィルタなしの場合、UserDefaults.logFilterLiftUuid()
の任意の値がありません、これはエラーでクラッシュする私のアプリを引き起こしている:NILを返すことができるNSPredicateに対して遅延varを作成するにはどうすればいいですか
NSInvalidArgumentException', reason: '*** -copyWithZone: cannot be sent to an abstract object of class NSPredicate: Create a concrete instance!
は、明らかに私は、コンクリートを作成する必要がありますNSPredicateのインスタンスですが、述語がない場合にこれを行う方法はわかりません。 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!
}
利用可能な方法は、私は何の述語がないようにしたいときは動作しません形式と引数のいくつかのフォーム(複数可)を期待しています。 guard let
ステートメントでは、私もreturn NSPredicate(value: false)
を試しましたが、fetchRequestがレコードを返さないと予想していました。
どうすればこの作品を作成できますか?