core-data - 使实体关系可编码/可解码时出错
问题描述
如何在使用coredata NSManagedObject映射时在swift4编码中编码/解码NSOrderedSet变量?
import CoreData
import Foundation
@objc(TestObject)
public class TestObject:NSManagedObject,Encodable
{
@nonobjc public class func fetchRequest() -> NSFetchRequest<TestObject> {
return NSFetchRequest<TestObject>(entityName: "TestObject")
}
@NSManaged public var testName: String?
@NSManaged public var devices: NSOrderedSet? // of entity type "Device"
enum CodingKeys: String, CodingKey {
case testName
case devices
}
public func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy:CodingKeys.self)
try container.encode(testName,forKey:.testName)
try container.encode(devices,forKey:.devices)
}
}
public required convenience init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
try container.decode(testName,forKey:.testName)
try container.decode(devices,forKey:.devices)
}
它给出了错误:编译器给出了这个错误
No 'decode' candidates produce the expected contextual result type 'NSOrderedSet?'
解决方案
您可以利用其中一个自动生成的访问器来做到这一点。
//addToDevices(_ value: Device)
public required convenience init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.testName = try container.decode(String.self, forKey: .testName)
let devices = try container.decode([Device].self, forKey:.devices)
devices.forEach { self.addToDevices($0) }
}
如果您没有自动生成的访问器,请按照以下步骤操作
- 选择您的项目数据模型文件
- 在菜单栏上选择 Apple 左侧第 7 个“编辑器”
- 选择“创建 NSManagedObject 子类
- 选中数据模型旁边的框
- 选中您要使用的实体的复选框
- 选择“创建”
推荐阅读
- requirejs - RequireJs 路径和 404 脚本
- google-cloud-platform - 有没有办法使用谷歌云控制台更新多个实体?
- c# - 如何防止 ASP.NET 解决方案中的 URL 文档访问?
- javascript - Nuxt.js 中的 $nuxt 属性是什么?
- c - 为什么 typedef 的名称可以用作结构成员的名称?
- c++ - 将 dll 注入 Windows 10 记事本
- flutter - Bloc 模式是否适合在 Flutter 应用中管理导航?
- python - 为什么 `lsvirtualenv` 不显示我的虚拟环境?
- sql - 如果通过 WHERE EXISTS 检查,有没有办法将多行插入 SQL 表?
- javascript - 在firestore批量写作,我可以在父母之前写孩子吗?