所以,我使用领域,我在两个模型之间有以下关系: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玩得好听?
答案 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。
抱歉,伙计们!