无法在 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
。所以你应该传递一个符合NSFetchRequestResult
的type
。
因此,如果您查看 NSFetchRequestResult
,您会发现它符合 NSObjectProtocol
。 NSDictionary
、NSManagedObject
和 NSManagedObjectID
也符合 NSFetchRequestResult
.
public protocol NSFetchRequestResult : NSObjectProtocol {
}
extension NSDictionary : NSFetchRequestResult {
}
extension NSManagedObject : NSFetchRequestResult {
}
extension NSManagedObjectID : NSFetchRequestResult {
}
很明显,您应该从这三个 NSDictionary
或 NSManagedObject
或 NSManagedObjectID
中的任何一个传递 type
。
像这样创建 NSFetchedResultsController
的实例。
let resultsController : NSFetchedResultsController<NSManagedObject>!
或者像这样
let resultsController : NSFetchedResultsController<NSManagedObjectID>!
或者像这样
let resultsController : NSFetchedResultsController<NSDictionary>!
Core Data 模型中的任何实体都映射为代码中生成的 NSManagedObject 的子类,因此它们都可以用来替换 AnyObject,它们都间接符合 NSFetchRequestResult 协议。您应该看到连接到此 FetchedResultsController 的 FetchRequest 正在获取哪个 entity/class,这就是您应该在那里使用的类型。
我在 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
。所以你应该传递一个符合NSFetchRequestResult
的type
。
因此,如果您查看 NSFetchRequestResult
,您会发现它符合 NSObjectProtocol
。 NSDictionary
、NSManagedObject
和 NSManagedObjectID
也符合 NSFetchRequestResult
.
public protocol NSFetchRequestResult : NSObjectProtocol {
}
extension NSDictionary : NSFetchRequestResult {
}
extension NSManagedObject : NSFetchRequestResult {
}
extension NSManagedObjectID : NSFetchRequestResult {
}
很明显,您应该从这三个 NSDictionary
或 NSManagedObject
或 NSManagedObjectID
中的任何一个传递 type
。
像这样创建 NSFetchedResultsController
的实例。
let resultsController : NSFetchedResultsController<NSManagedObject>!
或者像这样
let resultsController : NSFetchedResultsController<NSManagedObjectID>!
或者像这样
let resultsController : NSFetchedResultsController<NSDictionary>!
Core Data 模型中的任何实体都映射为代码中生成的 NSManagedObject 的子类,因此它们都可以用来替换 AnyObject,它们都间接符合 NSFetchRequestResult 协议。您应该看到连接到此 FetchedResultsController 的 FetchRequest 正在获取哪个 entity/class,这就是您应该在那里使用的类型。