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

Unable to instantiate NSFetchedResultController with generic type AnyObject in Swift 3

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

NSFetchedResultsController 需要一个泛型类型参数,而 AnyObject 到目前为止运行良好。编译器抛出错误:

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

让我更加困惑的是,如果你删除类型参数,XCode 会说:

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

并有用地建议使用 <AnyObject> 进行修复......然后循环重复。

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

如果你看一下 NSFetchedResultsController,你可以清楚地看到它有一个名称为 ResultType 的参数,它符合 NSFetchRequestResult。所以你应该传递一个符合NSFetchRequestResulttype

因此,如果您查看 NSFetchRequestResult,您会发现它符合 NSObjectProtocolNSDictionaryNSManagedObjectNSManagedObjectID 也符合 NSFetchRequestResult.

public protocol NSFetchRequestResult : NSObjectProtocol {
}

extension NSDictionary : NSFetchRequestResult {
}

extension NSManagedObject : NSFetchRequestResult {
}

extension NSManagedObjectID : NSFetchRequestResult {
}

很明显,您应该从这三个 NSDictionaryNSManagedObjectNSManagedObjectID 中的任何一个传递 type

像这样创建 NSFetchedResultsController 的实例。

let resultsController : NSFetchedResultsController<NSManagedObject>!

或者像这样

 let resultsController : NSFetchedResultsController<NSManagedObjectID>!

或者像这样

let resultsController : NSFetchedResultsController<NSDictionary>!

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