我有一个Realm模型类,我需要将其解码,以便可以从JSON序列化并将其保存到数据库。每个PortfolioItem
都与一个Product
相关联,有时我需要通过逆关系从PortfolioItem
进入Product
。这就是为什么我拥有LinkingObjects
属性。问题是当我尝试遵守Decodable
协议时。编译器给我一个错误Cannot automatically synthesize 'Decodable' because 'LinkingObjects<PortfolioItem>' does not conform to 'Decodable'
。怎么处理呢?我在网上很少了解LinkingObjects和Decodable,也不知道如何解决这个问题。
class PortfolioItem: Object {
@objc dynamic var id: String = ""
@objc dynamic var productId: String = ""
@objc dynamic public var product: Product?
convenience init(id: String, productId: String) {
self.init()
self.id = id
}
}
final class Product: Object, Decodable {
@objc dynamic var id: String = ""
@objc dynamic var name: String = ""
private let portfolioItems = LinkingObjects(fromType: PortfolioItem.self, property: "product")
public var portfolioItem: PortfolioItem? {
return portfolioItems.first
}
convenience init(id: String, name: String) {
self.init()
self.id = id
}
}
非常感谢Chris Shaw帮助我解决了这个问题。我写了一篇更深入的文章,介绍如何设置Decodable和LinkingObjects look HERE。
答案 0 :(得分:3)
好吧,除非我遗漏了某些东西,否则LinkingObjects
属性不需要包含在解码中。
我在这里的假设是,您正在从某个在线来源接收JSON,其中Product
的JSON由{id:“”,name:“”}组成。只要您使用关联的PortfolioItem
正确创建Product
,那么生成的LinkingObjects
属性就是Realm中动态查询的结果(因此无需任何JSON源就可以工作)
我今天不能测试编译答案,但是您应该能够使用CodingKeys来简单地排除该属性,即将其添加到Product
:-
private enum CodingKeys: String, CodingKey {
case id
case name
}
也是无关的,但是请注意,您的convenience init
函数不会初始化您要传入的所有属性。