无法在 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 `<...>`

并建议使用&lt;AnyObject&gt;....进行修复,然后循环重复。

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

【问题讨论】:

你想继承DataProviderDelegate的类吗? 除非真的有必要,否则永远不要在问题中添加图像。只需分享代码。 【参考方案1】:

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

因此,如果您查看NSFetchRequestResult,您会发现它符合NSObjectProtocol。还有NSDictionaryNSManagedObjectNSManagedObjectID 符合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>!

【讨论】:

你说的很对——我的原始(Swift 2)代码没有输入参数化 NSFetchedResultController。类型参数是由自动 Swift 3 重构添加的,现在看来这是一个要求,因为 Xcode 8 编译器拒绝了尝试在没有类型参数的情况下创建此类。我怀疑我的问题不是那么清楚,所以虽然它并没有真正解决问题,但我还是接受了。还有其他想法吗? AnyObject 替换为NSManagedObject,这就是您所要做的。忘记所有其他的东西。【参考方案2】:

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

【讨论】:

以上是关于无法在 Swift 3 中使用泛型 AnyObject 实例化 NSFetchedResultController的主要内容,如果未能解决你的问题,请参考以下文章

OC的泛型使用介绍

具有泛型的Swift函数,其中约束是自身符合的协议

NSManagedObjectContext 扩展中泛型函数中的奇怪 Swift 行为

Swift Generics,Constraints和KeyPaths

如何只接受在 Swift 中使用泛型的运算符的数字?

泛型约束-swift