【问题标题】:Error Making Entity Relationship Encodable/ Decodable使实体关系可编码/可解码时出错
【发布时间】:2018-06-07 07:14:19
【问题描述】:

在使用 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?'

【问题讨论】:

    标签: core-data swift4 codable decodable encodable


    【解决方案1】:

    您可以利用其中一个自动生成的访问器来做到这一点。

    //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) }
    }
    

    如果您没有自动生成的访问器,请按照以下步骤操作

    1. 选择您的项目数据模型文件
    2. 选择菜单栏Apple左侧第7个“编辑器”
    3. 选择“创建 NSManagedObject 子类”
    4. 选中数据模型旁边的框
    5. 选中您要使用的实体的复选框
    6. 选择“创建”

    【讨论】:

      【解决方案2】:

      这是因为,NSOrderedSet 不支持 Codable 协议。而是尝试使用Set

      @NSManaged public var devices: Set<String>? 
      

      您可以创建一个 Set 的任何您的应用支持的数据类型。

      【讨论】:

      • 那么您将如何将属性解码为 Set 并以有序集合或数组的形式返回结果?因为我需要有序的数据列表。
      • 如果我没记错的话,您正在使用Set 来获取不同的元素。为什么不过滤掉重复项并将其存储为数组?它将解决您使用 OrderedSet 的目的。
      • 我使用 set 是因为核心数据只提供 NSSet 或 NSOrderedSet 作为其“To-Many”关系的实体类型。
      猜你喜欢
      • 2018-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多