【问题标题】:Cannot convert value of type 'NSFetchRequest<NSFetchRequestResult>' to specified type 'NSFetchRequest<T>'无法将类型“NSFetchRequest<NSFetchRequestResult>”的值转换为指定类型“NSFetchRequest<T>”
【发布时间】:2018-01-05 14:37:55
【问题描述】:

我想使用 iOS10 中引入的新 Core Data API。

@available(iOS 10.0, *)
open class func fetchRequest() -> NSFetchRequest<NSFetchRequestResult>

我创建了获取各种对象的通用函数:

func getAllEntities<T: NSManagedObject>(ofType type: T.Type, success: @escaping ([T]) -> ()) throws -> [T] {
    let fetchRequest: NSFetchRequest<T> = T.fetchRequest()
    let asyncFetchRequest = NSAsynchronousFetchResult(fetchRequest: fetchRequest) { result in
        success(result.finalResult ?? [])
    }

    try databaseStack.persistentContainer.viewContext.execute(asyncFetchRequest)
}

但在let fetchRequest: NSFetchRequest&lt;T&gt; = T.fetchRequest() 行中我遇到了问题:

无法将'NSFetchRequest&lt;NSFetchRequestResult&gt;' 类型的值转换为指定类型'NSFetchRequest&lt;T&gt;'

我做错了什么?

【问题讨论】:

标签: ios swift core-data ios10


【解决方案1】:

T.fetchRequest() 返回一个NSFetchRequest&lt;NSFetchRequestResult&gt;, 您必须将其显式转换为特定的NSFetchRequest&lt;T&gt;

let fetchRequest = T.fetchRequest() as! NSFetchRequest<T>
let asyncFetchRequest = NSAsynchronousFetchRequest(fetchRequest: fetchRequest) { result in
    success(result.finalResult ?? [])
}

【讨论】:

  • 我曾希望我可以跳过强制转换。我要求.fetchRequest() 显式类型。好吧,没什么。 Tnx 为您解答。
【解决方案2】:

尝试其中任何一种。

一个: 我在我的项目中遇到过类似的事情。

我发现 Core Data 实体的自动生成的标头存在问题。尝试从以下位置删除:

/Users/**user**/Library/Developer/Xcode/DerivedData/**AppName**/Build/Intermediates/**AppName**/Debug-iphonesimulator/**AppName**.build/DerivedSources/CoreDataGenerated

然后清理你的项目 command+shift+K

然后尝试构建。

两个: 尝试使用let fetchRequest = NSFetchRequest&lt;T&gt;(entityName: NSStringFromClass(T.self))

Swifty 风格的第二种方法,100% 有效:

let fetchRequest = NSFetchRequest<T>(entityName: String(describing: T.self))

【讨论】:

  • 我在我的数据模型中将Codegen 设置为Manual/None,所以我没有自动生成的代码。也许是导致问题的原因?
  • 再次更新了我的答案
  • 第二个提议是一种解决方法。我想找出为什么我的解决方案不使用不同的 API 就无法工作。
【解决方案3】:

NSFetchRequest boilerplate 调用(例如,用于信息数组)以 () 结尾;不要忘记这一点,否则您可能会收到此类错误。

这很容易被忽略,尤其是当您输入代码而不是复制粘贴样板代码时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多