扩展符合NSFetchRequestResult协议的协议

4

我正在将我的代码迁移到Swift 3,但遇到了一个不确定的问题。

在2016年WWDC上,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)

有点令人困惑,因为我不认为这与二进制运算符有任何关系...在我草率地得出这是Swift的错误之前,我想知道是否有人遇到类似的问题。


我可以使用泛型来解决这个问题:

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个回答

1
这是一种Swift中的错误。更改为:

This is a bug in Swift. Change:

let fetchRequest = NSFetchRequest<Self>(entityName: Self.entityName)

to:

let fetchRequest: NSFetchRequest<Self> = NSFetchRequest(entityName: Self.entityName)

并且代码应该编译通过。


1
太棒了!谢谢Jack,我没想到尝试那个解决方法。我已经为此提交了一个雷达:https://openradar.appspot.com/radar?id=6083573912174592 - Jad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接