[英]Extending Protocols conforming to NSFetchRequestResult
我正在將我的代碼遷移到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)
}
}
這就是我現在要做的事情,但我不喜歡不理解為什么這不起作用。 如果有人可以幫助啟發這個問題,這將是非常棒的!
這是Swift中的一個錯誤。 更改:
let fetchRequest = NSFetchRequest<Self>(entityName: Self.entityName)
至:
let fetchRequest: NSFetchRequest<Self> = NSFetchRequest(entityName: Self.entityName)
並且代碼應該編譯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.