我正在将我的代码迁移到Swift 3,我遇到了一个我不是100%肯定的问题。
自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)
}
}
这就是我现在要做的事情,但我不想理解为什么这不起作用。如果有人可以帮助启发这个很棒的问题!
答案 0 :(得分:1)
这是Swift中的一个错误。变化:
let fetchRequest = NSFetchRequest<Self>(entityName: Self.entityName)
为:
let fetchRequest: NSFetchRequest<Self> = NSFetchRequest(entityName: Self.entityName)
并且代码应该编译。