无法将“NSKnownKeysDictionary1”()类型的值转换为“”()

Posted

技术标签:

【中文标题】无法将“NSKnownKeysDictionary1”()类型的值转换为“”()【英文标题】:Could not cast value of type 'NSKnownKeysDictionary1' () to '' () 【发布时间】:2017-09-20 09:12:08 【问题描述】:

我正在尝试将我的 NSManagedObject 转换为 Dictionary,以便我可以将其序列化为 JSON

func fetchRecord() -> [Record] 

        let fetchRequest = NSFetchRequest<Record>(entityName:"Record")
        let context = PersistenceService.context

        fetchRequest.resultType = .dictionaryResultType

        do 
            records = try context.fetch(Record.fetchRequest())

         catch 
            print("Error fetching data from CoreData")
        
        print(records)
        return records
 

我已经看过这个问题:How to convert NSManagedObject to NSDictionary 但他们的方法似乎与我的非常不同。我也尝试过这个问题中提供的方法:CoreData object to JSON in Swift 3。但是我收到此错误

无法将“NSKnownKeysDictionary1”(0x108fbcaf8) 类型的值转换为“iosTest01.Record”(0x1081cd690)$

我似乎找不到解决方案。

这里之前已经提到过这个错误:Core Data: Could not cast value of type 'MyType_MyType_2' to MyType 但没有一种方法可以解决我的问题。谁能为此提供一个 Swift 解决方案?

更新

为了帮助下面的评论,我添加了以下内容:

var record: Record!
var records = [Record]()

记录+核心数据类:

public class Record: NSManagedObject 


记录+核心数据属性:

extension Record 

    @nonobjc public class func fetchRequest() -> NSFetchRequest<Record> 
        return NSFetchRequest<Record>(entityName: "Record")
    

    @NSManaged public var name: String?


这是定义records 的地方。

【问题讨论】:

records 在哪里定义以及如何定义? – 对于resultType = .dictionaryResultType,获取请求返回一个字典数组,该数组与您的返回类型[Record]不兼容。 请查看我对这个问题的更新。 你想要一个 Record 对象数组还是一个字典数组? 我相信我需要一个字典数组才能将它们序列化为 JSON?我可能错了。 【参考方案1】:

为了从 fetch 请求中获取 dictionaries 数组 你必须做两件事:

设置fetchRequest.resultType = .dictionaryResultType(就像你已经做过的那样),然后 将获取请求声明为NSFetchRequest&lt;NSDictionary&gt;,而不是NSFetchRequest&lt;YourEntity&gt;

例子:

let fetchRequest = NSFetchRequest<NSDictionary>(entityName:"Event")
fetchRequest.resultType = .dictionaryResultType

// Optionally, to get only specific properties:
fetchRequest.propertiesToFetch = [ "prop1", "prop2" ]

do 
    let records = try context.fetch(fetchRequest)
    print(records)
 catch 
    print("Core Data fetch failed:", error.localizedDescription)

现在records 的类型为[NSDictionary] 并将包含一个 具有所获取对象的字典表示形式的数组。

【讨论】:

谢谢您,我的数据现在正在打印为字典。但是它改变了我现在显示数据的方式,因为它不再使用Record 类,而是使用NSDictionary。让我的数据像以前一样显示的最佳方法是什么? @Chace:我会使用单独的获取请求。一个(带有 NSFetchedResultsController)在表格视图中显示数据,另一个用于导出数据。 很好的解释。拯救了我的一天,或者我应该说“晚上”。谢谢你:)

以上是关于无法将“NSKnownKeysDictionary1”()类型的值转换为“”()的主要内容,如果未能解决你的问题,请参考以下文章

为啥我无法正确获取图像数据或无法将数据发送到服务器?

无法将 createdAt 和 updatedAt 保存为日期时间值,也无法将后端保存为前端

C# 无法将类型为“System.Byte[]”的对象强制转换为类型“System.Data.DataTable

无法将类型为“System.Collections.Generic.List`1[EPMS.Domain.SingleItem]”的对象强制转换为类型“EPMS

无法将 .json 文件从 CSV 下载到 JSON 转换并且无法将 JSON 转换为 CSV

无法将 ReactiveUI 添加到 NUnit 测试项目