无法在 Swift 3 中使用泛型 AnyObject 实例化 NSFetchedResultController
Posted
技术标签:
【中文标题】无法在 Swift 3 中使用泛型 AnyObject 实例化 NSFetchedResultController【英文标题】:Unable to instantiate NSFetchedResultController with generic type AnyObject in Swift 3 【发布时间】:2016-07-02 09:36:29 【问题描述】:我正在 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>
....进行修复,然后循环重复。
这看起来很像一个错误。在我报告之前有什么想法吗?
【问题讨论】:
你想继承DataProviderDelegate的类吗? 除非真的有必要,否则永远不要在问题中添加图像。只需分享代码。 【参考方案1】:如果你看一下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>!
【讨论】:
你说的很对——我的原始(Swift 2)代码没有输入参数化 NSFetchedResultController。类型参数是由自动 Swift 3 重构添加的,现在看来这是一个要求,因为 Xcode 8 编译器拒绝了尝试在没有类型参数的情况下创建此类。我怀疑我的问题不是那么清楚,所以虽然它并没有真正解决问题,但我还是接受了。还有其他想法吗? 将AnyObject
替换为NSManagedObject
,这就是您所要做的。忘记所有其他的东西。【参考方案2】:
Core Data 模型中的任何实体都映射为代码中生成的 NSManagedObject 的子类,因此它们都可以用来替换 AnyObject,它们都间接符合 NSFetchRequestResult 协议。您应该看到连接到此 FetchedResultsController 的 FetchRequest 正在获取哪个实体/类,这就是您应该在那里使用的类型。
【讨论】:
以上是关于无法在 Swift 3 中使用泛型 AnyObject 实例化 NSFetchedResultController的主要内容,如果未能解决你的问题,请参考以下文章
NSManagedObjectContext 扩展中泛型函数中的奇怪 Swift 行为