扩展符合 NSFetchRequestResult 的协议
Posted
技术标签:
【中文标题】扩展符合 NSFetchRequestResult 的协议【英文标题】:Extending Protocols conforming to NSFetchRequestResult 【发布时间】:2016-07-30 20:43:02 【问题描述】:我正在将我的代码迁移到 Swift 3,但我遇到了一个我不能 100% 确定的问题。
从 WWDC 2016 开始,Core Data 团队更新了他们的框架以对泛型更友好,新的增强版 NSFetchRequest
现在返回符合 NSFetchRequestResult
的对象。
所以在下面的代码中,我的基本协议符合上述NSFetchRequestResult
协议,在其子协议ManagedObjectFetchable
的扩展中,我想返回符合类型的获取对象:
import CoreData
@objc protocol ManagedObjectType: class, NSFetchRequestResult
protocol ManagedObjectFetchable: ManagedObjectType
extension ManagedObjectFetchable
static func preFetch(for predicate: Predicate, sortedBy sortDescriptors: [SortDescriptor]) throws -> [Self]
let fetchRequest = NSFetchRequest<Self>(entityName: Self.entityName)
fetchRequest.predicate = predicate
fetchRequest.sortDescriptors = sortDescriptors
let dummyContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
return try dummyContext.fetch(fetchRequest)
这里的问题是这一行:
// Error: Binary operator '<' cannot be applied to operands of type 'NSFetchRequest<_>.Type' and 'Self.Type'
let fetchRequest = NSFetchRequest<Self>(entityName: Self.entityName)
这有点令人困惑,因为我认为这与二元运算符没有任何关系......在我跳到太简单的结论之前,我想知道是否有人遇到过类似的问题。
我可以使用泛型解决这个问题:
extension ManagedObjectFetchable
static func preFetch<T: ManagedObjectFetchable>(for predicate: Predicate, sortedBy sortDescriptors: [SortDescriptor]) throws -> [T]
let fetchRequest = NSFetchRequest<T>(entityName: Self.entityName)
fetchRequest.predicate = predicate
fetchRequest.sortDescriptors = sortDescriptors
let dummyContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
return try dummyContext.fetch(fetchRequest)
这就是我现在要做的,但我不喜欢不理解为什么这不起作用。如果有人可以帮助解决这个问题,那就太棒了!
【问题讨论】:
【参考方案1】:这是 Swift 中的一个错误。变化:
let fetchRequest = NSFetchRequest<Self>(entityName: Self.entityName)
到:
let fetchRequest: NSFetchRequest<Self> = NSFetchRequest(entityName: Self.entityName)
并且代码应该可以编译。
【讨论】:
太棒了!谢谢杰克,我没想过尝试这种解决方法。我为此提交了一个雷达:openradar.appspot.com/radar?id=6083573912174592以上是关于扩展符合 NSFetchRequestResult 的协议的主要内容,如果未能解决你的问题,请参考以下文章
无法使用类型为“(NSFetchRequest<NSFetchRequestResult>)”的参数列表调用“获取”