将 'NSPersistentStoreResult' 强制转换为不相关的类型 'Entity' 总是失败的。

46

我正在创建一个小应用程序来学习CoreData中的多对多关系。然而,使用下面的代码时,我会得到一个错误,即从我的NSFetchResult强制转换为我的实体类('Groepering')时发生错误:

输入图像描述

我没有看到与我在互联网上找到的示例项目有任何区别,请问为什么类型转换仍然失败?

let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext

let fetchRequest : NSFetchRequest = NSFetchRequest(entityName: "Entity")

    do {
        let fetchResults = try managedContext.executeRequest(fetchRequest)
        let groeperingen = fetchResults as! [Entity]
        // Here I get the Error: ^

    } catch {
        print("Error")
}

4
这只是一个错字:managedContext.executeFetchRequest(fetchRequest)。它应该是这样的:managedObjectContext.executeFetchRequest(fetchRequest) - vadian
3个回答

112

在执行NSFetchRequest时,使用NSManagedObjectContext的executeFetchRequest方法。

编辑Swift 3:对于Swift 3,请使用:

let result = try managedContext.fetch(fetchRequest)

谢谢!我已经读了一千遍,但我仍然会不停地检查并在脑海中正确阅读它。 - Emptyless
2
在Swift 3中,此命令已更改为NSManagedObjectContext.fetch(NSFetchRequest<NSFetchRequestResult>)苹果文档链接 - Peter
3
我在调用let result = try managedContext.execute(fetchRequest)时,花了数小时发现方法名称拼写错误,应该是fetch而不是execute。 - Radek Wilczak

16

我最近把我的代码转换成Swift 3,遇到了同样的错误,尽管不是因为打错了字。看起来,新的等效函数调用是:let fetchResults = try managedContext.fetch(fetchRequest)


2
这适用于我在Swift 3中。还有一个managedObjectContext.execute(request)方法,但会产生与上述相同的问题。 - josephap
1
@PabloMartinez 我使用 let fetchResults = try managedContext.fetch(fetchRequest) as! [MySubclass] 进行结果转换。 - blwinters
1
@PabloMartinez 还有一个 let fetchRequest = NSFetchRequest<MySubClass>(entityName: "MyModel") 将使您的 fetchResults 转换为 [MySubClass] - Javier P
@JavierP(Swift 4.2)我尝试了您评论中的代码 - 控制台告诉我“无法专门化非泛型定义” - 在Swift 3-> 4之间是否有可能发生了一些变化? - andrewbuilder

4
这是解决方案(适用于Swift 4):
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Device")
    do {
        if let results = try persistentContainer.viewContext.fetch(fetchRequest) as? [NSManagedObject] {
            for result in results {
                if let name = result.value(forKey: "name") as? String, let type = result.value(forKey: "type") as? String {
                    print(name, "is an ", type)
                }
            }
        }
    } catch {
        print("Failed to fetch data request.")
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接