3 回答
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
实现,它不会由编译器使用自定义编码键自动合成。在这种情况下,你要指定唯一要列入键(属性)。
希望这可以帮助。
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每次使用时都强制解开。
- 3 回答
- 0 关注
- 623 浏览
添加回答
举报