Realm的Model类问题

时间:2018-11-13 06:22:57

标签: ios swift realm

我正在研究项目的某些模型类(正在使用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"
  }
}

这似乎很容易。具有变量和定义的主键的类。 但是还有另外一个看起来像这样的课程……

@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"
  }

  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)
  }

  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"
  }
}

我在这里不明白为什么要使用enumrequired initconvenience required init等…?

1 个答案:

答案 0 :(得分:1)

实际上,某些初始化程序是多余的。您的代码可以缩短为

@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。并且它的作者想自定义解码/编码行为,以便解码器仅对idnamepicturestatus进行解码/编码。为此,需要创建一个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的工作方式,请访问here