为了账号安全,请及时绑定邮箱和手机立即绑定

如何在核心数据中使用swift 4 Codable?

如何在核心数据中使用swift 4 Codable?

小怪兽爱吃肉 2019-09-21 11:22:24
可编码似乎是一个非常令人兴奋的功能。但是我想知道我们如何在核心数据中使用它?特别是,是否可以直接从NSManagedObject编码JSON或从其解码JSON?我尝试了一个非常简单的示例:并定义了Foo自己:import CoreData@objc(Foo)public class Foo: NSManagedObject, Codable {}但是当这样使用它时:let json = """{    "name": "foo",    "bars": [{        "name": "bar1",    }], [{        "name": "bar2"    }]}""".data(using: .utf8)!let decoder = JSONDecoder()let foo = try! decoder.decode(Foo.self, from: json)print(foo)编译器因以下错误而失败:super.init isn't called on all paths before returning from initializer而目标文件是定义的文件 Foo我想我可能做错了,因为我什至没有通过NSManagedObjectContext,但是我不知道该贴在哪里。核心数据是否支持Codable?
查看完整描述

3 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

CoreData是其自己的持久性框架,根据其详尽的文档,您必须使用其指定的初始化程序,并遵循相当特定的路径来创建和存储对象。

您仍然可以像使用Codable一样以有限的方式使用它NSCoding

一种方法是使用这两种协议之一解码对象(或结构),然后将其属性转移到NSManagedObject您根据Core Data文档创建的新实例中。

另一种方法(非常常见)是仅对要存储在托管对象属性中的非标准对象使用一种协议。“非标准”是指不符合模型中指定的Core Data的标准属性类型的任何内容。例如,NSColor不能将它直接存储为托管对象属性,因为它不是CD支持的基本属性类型之一。相反,您可以用于NSKeyedArchiver将颜色序列化为一个NSData实例,并将其作为Data属性存储在托管对象中。用逆转此过程NSKeyedUnarchiver。这很简单,使用Core Data可以有更好的方法(请参见Transient Attributes),但这说明了我的观点。

您也可以想象采用Encodable(组成的两个协议之一Codable-您能猜出另一个的名称吗?)将托管对象实例直接转换为JSON以进行共享,但是您必须指定编码键和自己的自定义encode实现,它不会由编译器使用自定义编码键自动合成。在这种情况下,你要指定唯一要列入键(属性)。

希望这可以帮助。


查看完整回答
反对 回复 2019-09-21
?
ibeautiful

TA贡献1993条经验 获得超5个赞

Swift 4.2:

按照casademora的解决方案,


guard let context = decoder.userInfo[.context] as? NSManagedObjectContext else { fatalError() }


应该


guard let context = decoder.userInfo[CodingUserInfoKey.context!] as? NSManagedObjectContext else { fatalError() }。


这样可以防止Xcode错误地将其识别为数组切片问题。


编辑:使用隐式解包的可选选项,无需.context每次使用时都强制解开。


查看完整回答
反对 回复 2019-09-21
  • 3 回答
  • 0 关注
  • 623 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信