无法将'NSFetchRequest <nsfetchrequestresult>'类型的值转换为指定类型'NSFetchRequest <t>'

时间:2018-01-05 14:37:55

标签: ios swift core-data ios10

我想使用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<T> = T.fetchRequest()行中我遇到了问题:

  

无法将'NSFetchRequest<NSFetchRequestResult>'类型的值转换为指定类型'NSFetchRequest<T>'

我做错了什么?

3 个答案:

答案 0 :(得分:3)

T.fetchRequest()返回NSFetchRequest<NSFetchRequestResult>, 您必须明确地将其强制转换为特定的NSFetchRequest<T>

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

答案 1 :(得分: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<T>(entityName: NSStringFromClass(T.self))

Swifty 第二种方式,100%工作:

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

答案 2 :(得分:0)

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

这很容易遗漏,尤其是如果您键入代码而不是复制粘贴样板代码。