如何为NSFetchRequest强制转换T.Type?

时间:2019-04-10 18:22:48

标签: swift generics core-data

我有一个方法签名:func fetch<T>(_ model: T.Type, predicate: NSPredicate?, sorted: Sorted?, completion: (([T]) -> Void)) where T: Storable,我想在NSFetchRequest中使用model

在这种情况下,使用extension NSManagedObject: Storable {},并且Storable协议内部具有一些基本的CRUD方法定义。

我尝试过:

  • T广播到NSManagedObject,但这会导致运算符优先级错误。 (T as! NSManagedObject)无效,因此。

  • 仅使用NSFetchRequest<T>(),但是编译器告诉我T does not conform to NSFetchRequestResult

  • where T: Storable, NSManagedObject,但这意味着必须更新我的协议以包含实现细节,而我不想去那里。

  • (model as! NSManagedObject).fetchRequest()Cast from 'T.Type' to unrelated type 'NSManagedObject' always fails

我想要实现的基本上是:我希望能够fetch(User.self, ...)使用该方法的当前签名。

1 个答案:

答案 0 :(得分:0)

答案是将T.Type强制转换为NSManagedObject.Type以具有类型,然后在其上调用.fetchRequest()

func fetch<T: Storable>(_ model: T.Type, predicate: NSPredicate?, sorted: Sorted?, completion: (([T]) -> Void)) {
    guard let managedObjectType = model as? NSManagedObject.Type else {
        return
    }

    let fetchRequest = managedObjectType.fetchRequest()
    fetchRequest.predicate = predicate
    ...
}