2017-06-22 2 views
0

私は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がレコードを返さないと予想していました。

どうすればこの作品を作成できますか?

答えて

0

NSPredicateは抽象クラスです。 NSPredicate()を持つことはできません。具体的なインスタンスを取得するには、必要な情報をインスタンス化する必要があります。

キーはNSPredicate?NSPredicateからliftUuidPredicateの種類を変更することで、代わりにguardが失敗した場合NSPredicate()リターンnilを返します。

私はスニペットをコンパイルするためにいくつかのボイラープレートコードを追加しましたので、必要に応じて変更する必要があります。

`extension UserDefaults { 

    class func logFilterLiftUuid() -> String? { 
     return "bar" 
    } 

    class func logSortSelection() -> String? { 
     return "bar" 
    } 

} 

class Foo { 

    let stack = NSFetchedResultsController<NSManagedObject>() 
    var fetchedResultsController = NSFetchedResultsController<NSFetchRequestResult>() 
    // throws the 'Create a concrete instance' error 
    lazy var liftUuidPredicate: NSPredicate? = { 
     guard let liftUuid = UserDefaults.logFilterLiftUuid() else { return nil } 

     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 
    } 

} 
関連する問題