列表不符合Encodable

时间:2018-02-05 09:12:13

标签: swift realm swift4 codable

所以,我使用领域,我在两个模型之间有以下关系:A unit has many tests

 // Unit model
 class Unit: Object, Decodable {
     @objc dynamic var id: String = ""
     ...
     let tests = List<Test>()

     enum CodingKeys: String, CodingKey {
          case id
          ...
          //case tests = "complete_control_tests"
     }

     convenience required init(from decoder: Decoder) throws {
          self.init()
          let container = try decoder.container(keyedBy: CodingKeys.self)
          id = try container.decode(String.self, forKey: .id)
          ...
          if let arr = try container.decodeIfPresent(Array<Test>.self, forKey: .tests) {
                tests.append(objectsIn: arr)
          } else {
                self.tests.append(objectsIn: [])
          }
     }
 }
 // Test model
 class Test: Object, Decodable {
     @objc dynamic var id: String = ""
     @objc dynamic var room_control_id: String = ""

     enum CodingKeys: String, CodingKey {
          case id
          case room_control_id = "room_control_id"

     }
 }

当注释tests属性时,我可以正确解析该模型的json输出。但是当我取消注释它时,我有以下错误:

Swift.Encodable:12:17: Protocol requires function 'encode(to:)' with type 'Encodable'
Models/Unit.swift:27:6: Cannot automatically synthesize 'Encodable' because 'List<Test>' does not conform to 'Encodable'

有没有办法让Codable和Realm玩得好听?

3 个答案:

答案 0 :(得分:3)

您的代码存在一些问题。首先,如果您只想实施init(from:)方法,而不是encode方法,请声明与Decodable而不是Codable的一致性。其次,在创建自己的CodingKeys方法时需要实现init(from:),并且还需要从便捷初始化程序中调用类的指定初始值设定项。

初始值设定项中也不需要else子句,因为tests已经初始化为空List并且向它添加空数组是没有意义的。

class Unit: Object, Decodable {
    @objc dynamic var id: String = ""
    let tests = List<Test>()

    private enum CodingKeys: String, CodingKey {
        case id, tests
    }

    convenience required init(from decoder: Decoder) throws {
        self.init()
        let container = try decoder.container(keyedBy: CodingKeys.self)
        id = try container.decode(String.self, forKey: .id)
        if let arr = try container.decodeIfPresent(Array<Test>.self, forKey: .tests) {
            tests.append(objectsIn: arr)
        }
    }
}

答案 1 :(得分:1)

第一条错误消息明确指出,如果您实施自定义init方法( decode ),您还必须实施encode(to:) encode )符合协议。

如果您只是解码对象并且不需要编码,则只采用Decodable. 否则实施encode(to:)

要解决第二个错误,请明确声明CodingKeys

答案 2 :(得分:0)

我发现为什么它不起作用。这是Xcode的缓存。我删除了Xcode Derived数据文件夹的内容,现在它正在编译和解析json。

抱歉,伙计们!