2016-07-30 34 views
2

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!

Antwort

1

Dies ist ein Fehler in Swift. Wechsel:

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

zu:

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

und sollte der Code kompilieren.

+1

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