扩展符合 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>)”的参数列表调用“获取”

核心数据 - NSFetchRequestResult:结果中的一对多关系中的项目数?

符合协议的 Swift 扩展

协议扩展,不符合协议

仅在符合特定协议时才对类进行 Swift 扩展

UISearchResultsUpdating 不符合视图控制器中的扩展类