2016-07-02 11 views
4

zu instantiieren Ich experimentiere mit CoreData in Swift 3 und habe einen sehr bizarren zirkulären Compilerfehler in Xcode 8 Beta.Nicht möglich, NSFetchedResultController mit generischem Typ AnyObject in Swift 3

NSFetchedResultsController benötigt einen generischen Typparameter und AnyObject hat bis jetzt funktioniert. Der Compiler den Fehler wirft:

Type 'AnyObject' does not conform to protocol 'NSFetchRequestObject' 

Screen shot

Für mich besonders verwirrt zu machen, wenn Sie den Typ-Parameter löschen, XCode sagt dann:

Reference to generic type NSFetchedResultsController requires argument in `<...>` 

und schlägt vor, helfend ein Update mit <AnyObject>. ... und der Zyklus wiederholt sich.

Das sieht sehr nach einem Fehler aus. Irgendwelche Ideen bevor ich es melde?

+0

Möchten Sie die Klasse von DataProviderDelegate erben? – Dershowitz123

+0

Fügen Sie der Frage auch niemals Bilder hinzu, es sei denn, dies ist wirklich notwendig. Teilen Sie einfach den Code. –

Antwort

9

Wenn Sie einen Blick in NSFetchedResultsController werfen, können Sie deutlich sehen, dass es einen Parameter mit dem Namen ResultType hat, der NSFetchRequestResult entspricht. Sie sollten also eine type übergeben, die NSFetchRequestResult entspricht. Wenn Sie einen Blick in NSFetchRequestResult werfen, können Sie sehen, dass es NSObjectProtocol entspricht. Auch NSDictionary, NSManagedObject und NSManagedObjectID entspricht NSFetchRequestResult.

public protocol NSFetchRequestResult : NSObjectProtocol { 
} 

extension NSDictionary : NSFetchRequestResult { 
} 

extension NSManagedObject : NSFetchRequestResult { 
} 

extension NSManagedObjectID : NSFetchRequestResult { 
} 

So ist es klar, dass man eine type von einem dieser drei NSDictionary oder NSManagedObject oder NSManagedObjectID passieren sollte. Erstellen Sie Ihre Instanz NSFetchedResultsController so.

let resultsController : NSFetchedResultsController<NSManagedObject>! 

oder ähnliche

let resultsController : NSFetchedResultsController<NSManagedObjectID>! 

oder ähnliche

let resultsController : NSFetchedResultsController<NSDictionary>! 
+0

Sie haben ganz recht - mein ursprünglicher Code (Swift 2) hat keine Parametereingabe NSFetchedResultController eingegeben. Der Typparameter wurde von einem automatisierten Swift 3-Refactor hinzugefügt, und es scheint nun erforderlich zu sein, dass der Versuch, diese Klasse ohne einen Typparam zu erstellen, vom Xcode 8-Compiler abgelehnt wird. Ich vermute, meine Frage war nicht so klar, obwohl es das Problem nicht wirklich gelöst hat, habe ich trotzdem akzeptiert. Irgendwelche anderen Ideen? – rustproofFish

+2

Ersetzen Sie das '' 'AnyObject''' durch '' 'NSManagedObject''', das ist alles was Sie tun müssen. Vergiss alle anderen Sachen. –

0

jede Einheit Ihre Kerndatenmodell Karten als eine Unterklasse von NSManagedObject im Code erzeugt, so dass sie alle verwendet werden können, um AnyObject zu ersetzen, stimmen sie alle indirekt mit dem NSFetchRequestResult-Protokoll überein. Sie sollten sehen, welche Entität/Klasse von Ihrem FetchRequest abgerufen wird, der mit diesem FetchedResultsController verbunden ist, und das ist der Typ, den Sie dort verwenden sollten.