【问题标题】:Unable to instantiate NSFetchedResultController with generic type AnyObject in Swift 3无法在 Swift 3 中使用泛型 AnyObject 实例化 NSFetchedResultController
【发布时间】: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的类吗?
  • 除非真的有必要,否则永远不要在问题中添加图像。只需分享代码。

标签: core-data swift3 xcode8


【解决方案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 正在获取哪个实体/类,这就是您应该在那里使用的类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    相关资源
    最近更新 更多