我在Swift 3中尝试使用CoreData,并且在Xcode 8 beta中遇到了一个非常奇怪的循环编译器错误。
NSFetchedResultsController需要一个泛型类型参数,AnyObject到目前为止工作正常。编译器抛出错误:
Type 'AnyObject' does not conform to protocol 'NSFetchRequestObject'
为了让我更加困惑,如果你删除了type参数,XCode会说:
Reference to generic type NSFetchedResultsController requires argument in `<...>`
并使用<AnyObject>
来帮助建议修复....并且循环重复。
这看起来非常像一个错误。我报告之前有什么想法吗?
答案 0 :(得分:9)
如果您查看NSFetchedResultsController
,可以清楚地看到它的参数名称ResultType
符合NSFetchRequestResult
。因此,您应该传递符合type
的{{1}}。
因此,如果您查看NSFetchRequestResult
,就可以看到它符合NSFetchRequestResult
。此外,NSObjectProtocol
,NSDictionary
和NSManagedObject
符合NSManagedObjectID
。
NSFetchRequestResult
很明显,您应该从这三个public protocol NSFetchRequestResult : NSObjectProtocol {
}
extension NSDictionary : NSFetchRequestResult {
}
extension NSManagedObject : NSFetchRequestResult {
}
extension NSManagedObjectID : NSFetchRequestResult {
}
或type
或NSDictionary
中的任何一个传递NSManagedObject
。
像这样创建NSManagedObjectID
的实例。
NSFetchedResultsController
或者像这样
let resultsController : NSFetchedResultsController<NSManagedObject>!
或者像这样
let resultsController : NSFetchedResultsController<NSManagedObjectID>!
答案 1 :(得分:0)
Core Data模型中的任何实体都映射为代码中生成的NSManagedObject的子类,因此它们都可以用来替换AnyObject,它们都间接符合NSFetchRequestResult协议。您应该看到连接到此FetchedResultsController的FetchRequest正在获取哪个实体/类,以及您应该在那里使用的类型。