我有一个方法签名:func fetch<T>(_ model: T.Type, predicate: NSPredicate?, sorted: Sorted?, completion: (([T]) -> Void)) where T: Storable
我想使用 model
在 NSFetchRequest 中。
在这种情况下,extension NSManagedObject: Storable {}
使用 Storable
协议(protocol)内部有一些基本的CRUD方法定义。
我已经尝试过:
类型转换
T
至NSManagedObject
,但这会导致运算符优先级错误。(T as! NSManagedObject)
因此不起作用。仅使用
NSFetchRequest<T>()
但编译器告诉我T does not conform to NSFetchRequestResult
.where T: Storable, NSManagedObject
但这意味着必须更新我的协议(protocol)以获得实现细节,而我不想去那里。(model as! NSManagedObject).fetchRequest()
但是Cast from 'T.Type' to unrelated type 'NSManagedObject' always fails
我想要实现的基本上是:我希望能够 fetch(User.self, ...)
如果可能的话,使用该方法的当前签名。
最佳答案
答案是将 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
...
}
关于swift - 如何为 NSFetchRequest 转换 T.Type?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55619039/