我正在将我的代码迁移到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)
}
}
目前我正在使用这个,但是我不喜欢不明白为什么它不能工作。如果有人能帮助解决这个问题,那就太棒了!