На самом деле, некоторые из инициализаторов являются избыточными. Ваш код может быть сокращен до
@objcMembers class CommB: Object, Codable {
dynamic var id = "0"
dynamic var name: String?
dynamic var picture: String?
dynamic var status: String?
dynamic var lastSeen: String?
dynamic var unreadMessageCount = 0
dynamic var lastMessage: MyMessage?
enum CodingKeys: String, CodingKey {
case id = "UsrID"
case name = "UserName"
case picture = "UsrPicture"
case status = "ChatStatus"
}
convenience init(id: String, name: String, picture: String, status: String) {
self.init()
self.id = id
self.name = name
self.picture = picture
self.status = status
}
convenience required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
let id = try container.decode(String.self, forKey: .id)
let name = try container.decode(String.self, forKey: .name)
let picture = try container.decode(String.self, forKey: .picture)
//let status = try container.decode(String.self, forKey: .status)
self.init(id: id, name: name, picture: picture, status: "status")
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(id, forKey: .id)
try container.encode(name, forKey: .name)
try container.encode(picture, forKey: .picture)
try container.encode(status, forKey: .status)
}
override class func primaryKey() -> String? {
return "id"
}
}
Я удалил
required init() {
super.init()
}
required init(value: Any, schema: RLMSchema) {
super.init(value: value, schema: schema)
}
required init(realm: RLMRealm, schema: RLMObjectSchema) {
super.init(realm: realm, schema: schema)
}
Все остальное очень важно.
CommB
- это не только объект области, но также Codable
. И автор этого хотел настроить поведение де / кодирования так, чтобы де / кодер только де / кодировал id
, name
, picture
и status
. Для этого необходимо создать перечисление CodingKey
, хранящее ключи кодирования. Кроме того, convenience required init(from decoder: Decoder)
и func encode(to encoder: Encoder)
должны быть реализованы.
Инициализатор convenience init(id: String, name: String, picture: String, status: String)
существует, поскольку init(from decoder: Decoder)
делегирует его.
Чтобы узнать больше о том, как Codable
работает, посетите здесь .