2016-06-29 20 views
1

Ich habe ein Objekt, das ein Wörterbuch der Schlüsselpfade verwendet, um Anforderungen abzurufen. Jede Abrufanforderung repräsentiert eine andere Entität. Das ist alles in Ordnung und funktioniert unter Swift 2.3 und niedriger. Wenn ich jedoch versuche, mein Projekt in Swift 3 zu konvertieren, stoße ich auf Probleme mit den neuen Generika für Abrufanforderungen. Fetch-Anfragen haben tendenziell den Typ, den sie zurückgeben, aber mein Wörterbuch muss Abrufanforderungen haben, die alle Arten von Typen zurückgeben. Wenn ich versuche, ein Lexikon des Typs [String:NSFetchRequest<NSManagedObject>] oder [String:NSFetchRequest<NSFetchRequestResult>] mit Abrufanforderungen speziell des Typs NSFetchRequest<Message> zu erstellen. (Message ist eine NSManagedObject Unterklasse) bekomme ich einen Compiler-Fehler:Sammlung von NSFetchRequests in Swift 3

Cannot convert value of type 'NSFetchRequest< Message >' to expected dictionary

Werttyp ‚NSFetchRequest‘

Wie kann ich einen Antrag auf eine allgemeinere Anforderungstyp holen holen niedergeschlagenen?

+1

Deklarieren Sie den Wörterbucheintrag als "AnyObject" oder verwenden Sie "NSDictionary". –

+0

Könnten Sie bitte den '' 'Swift2''' Code hier teilen, so dass wir versuchen können, ihn in' '' Swift3''' zu konvertieren –

+0

Die Verwendung eines allgemeineren Wörterbuchs würde funktionieren ([String: NSPersistentStoreRequest] würde auch funktionieren) aber würde dann eine Besetzung erfordern, wenn ich aus dem Wörterbuch lese. Aber das hat mich zum Nachdenken gebracht, könntest du einen Typ von NSFetchRequest in einen anderen umwandeln? Sie können! 'fetchRequestA as! NSFetchRequest 'funktioniert. Es ist ziemlich klobig, aber es funktioniert. –

Antwort

0

Anscheinend können Sie von einem Abrufanforderungstyp auf einen anderen umwandeln. Es ist jedoch etwas klobig. Ich kann mir nicht vorstellen, dass die Besetzung fehlschlagen würde. In ObjC würden Sie die Besetzung nicht einmal brauchen.

class A: NSManagedObject {} 
class B: NSManagedObject {} 

let fetchRequestA = NSFetchRequest<A>() 
let fetchRequestB = NSFetchRequest<B>() 

let fetchRequests: [String:NSFetchRequest<NSManagedObject>] = [ 
    "a" : fetchRequestA as! NSFetchRequest<NSManagedObject>, 
    "b" : fetchRequestB as! NSFetchRequest<NSManagedObject>, 
]