领域模型类可以符合Codable,因此不需要两个单独的类型。
您只需要将User 转换为一个类,使其继承自Object 以让Realm 知道它是一个Realm 模型类并标记所有属性@objc dynamic 使其成为托管属性。
class User: Object, Codable {
@objc dynamic var id:Int = 0
@objc dynamic var username:String = ""
@objc dynamic var email:String = ""
}
List 不符合 Decodable 开箱即用,因此要创建一个 Decodable 类,即使它具有一对多关系,您也需要实现自定义 init(from decoder:) 方法。
let userJSON = """
{
"id":1,
"username":"John",
"email":"example@ex.com",
"dogs":[
{"id":2,"name":"King"},
{"id":3,"name":"Kong"}
]
}
"""
class Dog: Object,Codable {
@objc dynamic var id:Int = 0
@objc dynamic var name:String = ""
}
class User: Object, Decodable {
@objc dynamic var id:Int = 0
@objc dynamic var username:String = ""
@objc dynamic var email:String = ""
let dogs = List<Dog>()
private enum CodingKeys: String, CodingKey {
case id, username, email, dogs
}
required convenience init(from decoder: Decoder) throws {
self.init()
let container = try decoder.container(keyedBy: CodingKeys.self)
id = try container.decode(Int.self, forKey: .id)
username = try container.decode(String.self, forKey: .username)
email = try container.decode(String.self, forKey: .email)
let dogsArray = try container.decode([Dog].self, forKey: .dogs)
dogs.append(objectsIn: dogsArray)
}
}
let decodedUser = try? JSONDecoder().decode(User.self, from: userJSON.data(using: .utf8)!)