【发布时间】:2019-04-10 18:22:48
【问题描述】:
我有一个方法签名: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, ...) 使用该方法的当前签名。
【问题讨论】:
-
我建议使用协议扩展,例如this
-
@vadian 有趣,我会使用我自己的
Storable协议而不是 Fetchable 进行扩展,对吧? -
@vadian 你的链接答案中的 associatedtype 不是以这种方式与
NSManagedObject紧密耦合吗? -
这只是一个如何使用带有关联类型的协议扩展的示例。是的,关联类型始终是
NSManagedObject子类。使已经泛型的类型像NSFetchRequestmore 泛型 是完全不可能的 -
我偶然发现了一种方法来做到这一点,所以我回答了我自己的问题,但非常感谢你的帮助,@vadian!