Проблема с Модельным классом Царства - PullRequest
0 голосов
/ 13 ноября 2018

Я изучал некоторые модельные классы проекта (используется Realm).Это один класс ...

@objcMembers class CommA: Object {
  dynamic var id = 0
  dynamic var recipientId = "0"
  dynamic var name: String?
  dynamic var picture: String?
  dynamic var unreadMessageCount = 0
  dynamic var lastMessage: MyMessage?

  override class func primaryKey() -> String? {
    return "id"
  }
}

Это довольно просто.Определен класс с переменными и первичным ключом. Но есть еще один класс, который выглядит так ...* и т. д. используется…?

1 Ответ

0 голосов
/ 13 ноября 2018

На самом деле, некоторые из инициализаторов являются избыточными. Ваш код может быть сокращен до

@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 работает, посетите здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...