gpt4 book ai didi

swift - 列表不符合 Encodable

转载 作者:搜寻专家 更新时间:2023-11-01 06:14:10 24 4
gpt4 key购买 nike

所以,我使用的是 Realm ,我在两个模型之间有以下关系:一个单元有很多测试:

 // 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 玩得更好?

最佳答案

您的代码存在多个问题。首先,如果你只想实现 init(from:) 方法,而不是 encode 方法,声明符合 Decodable 而不是比 Codable。其次,您需要在创建自己的 init(from:) 方法时实现 CodingKeys,并且还需要从便利初始化器调用类的指定初始化器。

初始化器中也不需要 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)
}
}
}

关于swift - 列表不符合 Encodable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48619049/

24 4 0
文章推荐: swift - 在 Swift 中重铸时,何时使用 " as "以及何时使用 ()
文章推荐: ios - 解码 API 数据