无法在Swift 3中使用泛型类型AnyObject实例化NSFetchedResultController

时间:2016-07-02 09:36:30

标签: core-data swift3 xcode8

我在Swift 3中尝试使用CoreData,并且在Xcode 8 beta中遇到了一个非常奇怪的循环编译器错误。

NSFetchedResultsController需要一个泛型类型参数,AnyObject到目前为止工作正常。编译器抛出错误:

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

Screen shot

为了让我更加困惑,如果你删除了type参数,XCode会说:

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

并使用<AnyObject>来帮助建议修复....并且循环重复。

这看起来非常像一个错误。我报告之前有什么想法吗?

2 个答案:

答案 0 :(得分:9)

如果您查看NSFetchedResultsController,可以清楚地看到它的参数名称ResultType符合NSFetchRequestResult。因此,您应该传递符合type的{​​{1}}。

因此,如果您查看NSFetchRequestResult,就可以看到它符合NSFetchRequestResult。此外,NSObjectProtocolNSDictionaryNSManagedObject符合NSManagedObjectID

NSFetchRequestResult

很明显,您应该从这三个public protocol NSFetchRequestResult : NSObjectProtocol { } extension NSDictionary : NSFetchRequestResult { } extension NSManagedObject : NSFetchRequestResult { } extension NSManagedObjectID : NSFetchRequestResult { } typeNSDictionary中的任何一个传递NSManagedObject

像这样创建NSManagedObjectID的实例。

NSFetchedResultsController

或者像这样

let resultsController : NSFetchedResultsController<NSManagedObject>!

或者像这样

 let resultsController : NSFetchedResultsController<NSManagedObjectID>!

答案 1 :(得分:0)

Core Data模型中的任何实体都映射为代码中生成的NSManagedObject的子类,因此它们都可以用来替换AnyObject,它们都间接符合NSFetchRequestResult协议。您应该看到连接到此FetchedResultsController的FetchRequest正在获取哪个实体/类,以及您应该在那里使用的类型。