我有一个方法签名: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, ...)
使用该方法的当前签名。
答案 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
...
}