2016-07-02 5 views
4

Swift 3でCoreDataを試していて、Xcode 8ベータ版の非常に奇妙な循環コンパイラエラーが発生しています。NSFetchedResultControllerをSwift 3のジェネリック型AnyObjectでインスタンス化できません

NSFetchedResultsControllerにはジェネリック型のパラメータが必要です。AnyObjectは今までは正常に動作していました。コンパイラはエラーをスロー:

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

Screen shot

あなたは型パラメータを削除した場合、私は余分な混乱して作るために、XCodeのは、こう述べています。

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

と親切が<AnyObject>を使用して修正を示唆しています。 ...そしてサイクルが繰り返されます。

これは非常にバグのようです。私はそれを報告する前に任意のアイデア?

+0

DataProviderDelegateからクラスを継承しますか? – Dershowitz123

+0

また、本当に必要でない限り、質問に画像を追加しないでください。コードを共有するだけです。 –

答えて

9

NSFetchedResultsControllerを調べると、NSFetchRequestResultに準拠した名前がResultTypeのパラメータが含まれていることがわかります。したがってNSFetchRequestResultに準拠するtypeを渡す必要があります。

NSFetchRequestResultを調べると、NSObjectProtocolに準拠していることがわかります。また、NSDictionary,NSManagedObjectおよびNSManagedObjectIDは、NSFetchRequestResultに準拠しています。

public protocol NSFetchRequestResult : NSObjectProtocol { 
} 

extension NSDictionary : NSFetchRequestResult { 
} 

extension NSManagedObject : NSFetchRequestResult { 
} 

extension NSManagedObjectID : NSFetchRequestResult { 
} 

だから、明確にあなたがこれらの3 NSDictionaryまたはNSManagedObjectまたはNSManagedObjectIDのいずれかからtypeを渡すべきです。

このようにNSFetchedResultsControllerのインスタンスを作成します。それらはすべて使用することができますので、あなたのコード内で発生したNSManagedObjectのサブクラスとして

let resultsController : NSFetchedResultsController<NSManagedObject>! 

またはこのような

let resultsController : NSFetchedResultsController<NSManagedObjectID>! 

たり、コアデータモデルマップでこの

let resultsController : NSFetchedResultsController<NSDictionary>! 
+0

あなたは大丈夫です - 私の元の(Swift 2)コードは、パラメータNSFetchedResultControllerをタイプしませんでした。タイプパラメータは自動化されたSwift 3リファクタによって追加されました。タイプパラメータなしでこのクラスを作成しようとすると、Xcode 8コンパイラによって拒否されるため、今や要件となっているようです。私は私の質問がそれほど明確ではなかったと考えています。問題を本当に解決していないのに、とにかく私は受け入れました。他のアイデア? – rustproofFish

+2

'' AnyObject'''を '' 'NSManagedObject'''に置き換えれば、それだけです。他のすべてのものについては忘れてください。 –

0

任意のエンティティのようなAnyObjectを置き換えるために、それらはすべてNSFetchRequestResultプロトコルに間接的に準拠しています。このFetchedResultsControllerに接続されているFetchRequestによってフェッチされているエンティティ/クラスが表示されている必要があります。

関連する問題