尝试将我的一些代码库切换到 Swift 4 的新版本Codable
协议。我的设置看起来像这样:
class Base: Object, Codable {
dynamic var id: String = ""
dynamic var timestamp: String = ""
private enum CodingKeys: String, CodingKey {
case id = "_id"
case timestamp = "timestamp"
}
}
class User: Base {
dynamic var name: String = ""
private enum CodingKeys: String, CodingKey {
case name = "name"
}
required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.name = try container.decode(String.self, forKey: .name)
try super.init(from: decoder)
}
}
我有一个符合以下条件的基本领域对象类Codable
,以及一个子类Base
它也有自己的编码键。我覆盖init(decoder:)
on the User
子类来映射我的附加编码键,然后调用super.init(decoder:)
to map Base
的编码键。但是,一旦我覆盖init(decoder:)
我收到以下错误:
- 所需的初始化程序“init()”必须由“Base”的子类提供
- 所需的初始化程序“init(realm:schema:)”必须由“Base”的子类提供
- 所需的初始化程序“init(value:schema:)”必须由“Base”的子类提供
我不确定解决这些问题的正确方法是什么。
你不能覆盖init()
或 Realm 的其他初始化器Object
。您可以改用便利初始化程序。那么你就不能打电话super.init(from:)
,因此定义一个解码超类属性的方法,例如Base.decode(from:)
.
请参阅以下代码示例:
class Base: Object, Codable {
dynamic var id: String = ""
dynamic var timestamp: String = ""
private enum CodingKeys: String, CodingKey {
case id = "_id"
case timestamp = "timestamp"
}
func decode(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.id = try container.decode(String.self, forKey: .id)
self.timestamp = try container.decode(String.self, forKey: .timestamp)
}
}
class User: Base {
dynamic var name: String = ""
private enum CodingKeys: String, CodingKey {
case id = "_id"
case timestamp
case name = "name"
}
required convenience init(from decoder: Decoder) throws {
self.init()
try decode(from: decoder)
let container = try decoder.container(keyedBy: CodingKeys.self)
self.name = try container.decode(String.self, forKey: .name)
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)