Ich migriere meinen Code zu Swift 3, und ich stieß auf ein Problem, über das ich mich nicht 100% ig sicher bin.Protokolle erweitern, die NSFetchRequestResult entsprechen
Ab WWDC 2016 die Core Data-Team ihren Rahmen aktualisierte freundlicher Generika zu sein und die neuen aufgepeppt NSFetchRequest
jetzt Objekte zurückgibt, die die NSFetchRequestResult
entsprechen.
So in dem folgenden Code ich mein Basis-Protokoll, die zu dem genannten NSFetchRequestResult
Protokoll entspricht, und in einer Verlängerung ihres Kind Protokoll ManagedObjectFetchable
ich Objekte von konformen Typen holen zurückkehren will:
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)
}
}
Das Problem hier ist diese Zeile:
// Error: Binary operator '<' cannot be applied to operands of type 'NSFetchRequest<_>.Type' and 'Self.Type'
let fetchRequest = NSFetchRequest<Self>(entityName: Self.entityName)
es ist ein wenig verwirrend ist, weil ich nicht glaube, das etwas mit binären Operatoren zu tun hat ... Bevor ich auf den allzu leicht Schluss ziehen, dass es ein Fehler, den ich Swift Ich frage mich, ob ein Yone stieß auf ähnliche Probleme.
Ich bin um diese Verwendung von Generika zu erhalten Lage:
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)
}
}
Dies ist, was ich mit für jetzt werde ich aber verstehen nicht mag nicht, warum das nicht funktionieren würde. Wenn jemand helfen könnte, dieses Problem aufzuklären, wäre das großartig!
Fantastisch! Danke Jack, ich dachte nicht daran, diese Problemumgehung zu versuchen. Ich habe dafür ein Radar erstellt: https://openradar.appspot.com/radar?id=6083573912174592 – Jad