如何在 swift4 可编码中编码/解码 NSOrderedSet 变量,同时使用 coredata NSManagedObject 进行映射?
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) }
}
如果您没有自动生成的访问器,请按照以下步骤操作
- 选择您的项目数据模型文件
- 选择菜单栏上苹果左侧第 7 个“编辑器”
- 选择“创建 NSManagedObject 子类
- 选中数据模型旁边的复选框
- 选中您要使用的实体的复选框
- 选择“创建”
关于core-data - 使实体关系可编码/可解码时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50735042/