无法在Swift 3中实例化具有泛型类型AnyObject的NSFetchedResultController

问题描述:

我在Swift 3中试验CoreData,并且遇到了Xcode 8 beta中非常奇怪的循环编译器错误。无法在Swift 3中实例化具有泛型类型AnyObject的NSFetchedResultController

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

除非确实需要,否则绝不要在图像中添加图像。只需分享代码。 –

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

所以,如果你看看NSFetchRequestResult,你可以看到它符合NSObjectProtocol。另外NSDictionary,NSManagedObjectNSManagedObjectID符合NSFetchRequestResult

public protocol NSFetchRequestResult : NSObjectProtocol { 
} 

extension NSDictionary : NSFetchRequestResult { 
} 

extension NSManagedObject : NSFetchRequestResult { 
} 

extension NSManagedObjectID : NSFetchRequestResult { 
} 

那么清楚,你应该通过从上述三种NSDictionaryNSManagedObjectNSManagedObjectIDtype

像这样创建您的NSFetchedResultsController的实例。

let resultsController : NSFetchedResultsController<NSManagedObject>! 

或类似这样的

let resultsController : NSFetchedResultsController<NSManagedObjectID>! 

或类似这样的

let resultsController : NSFetchedResultsController<NSDictionary>! 
+0

你说的很对 - 我原来的(Swift 2)代码没有输入parameterise NSFetchedResultController。类型参数是由一个自动化的Swift 3重构添加的,它似乎是一个需求,因为试图创建这个类而没有类型参数被Xcode 8编译器拒绝。我怀疑我的问题并不那么清楚,尽管它没有真正解决问题,但我仍然接受。任何其他想法? – rustproofFish

+2

用'''NSManagedObject''替换'''AnyObject'',这就是你所要做的。忘掉所有其他的东西。 –

在核心数据模型映射在你的代码生成的NSManagedObject的子类的任何实体,所以他们都可以使用要替换AnyObject,它们都会间接遵循NSFetchRequestResult协议。您应该看到哪个实体/类正在通过连接到此FetchedResultsController的FetchRequest获取,这就是您应该在那里使用的类型。