Swift `RLMArray`不符合协议';可编码';

Swift `RLMArray`不符合协议';可编码';,swift,realm,swift4,codable,Swift,Realm,Swift4,Codable,我想做: 使用JSONDecoder(),我将json转换为Realm对象 我将这个对象保存到领域数据库中 问题: RLMArray不应用Codable协议 我可以符合Decodable协议,但Codable我不能 错误消息: 类型“Person”不符合协议“Encodable” 代码: 公共类爱好:对象,可编码{ @objc动态变量标题:字符串? @objc动态变量类别:字符串? } 公共类Person:对象,可编码{//错误:类型“Person”不符合协议“Encodable”

我想做:

  • 使用
    JSONDecoder()
    ,我将
    json
    转换为
    Realm
    对象
  • 我将这个对象保存到
    领域
    数据库中
问题:

  • RLMArray
    不应用
    Codable
    协议
  • 我可以符合
    Decodable
    协议,但
    Codable
    我不能
错误消息:

  • 类型“Person”不符合协议“Encodable”
代码:

公共类爱好:对象,可编码{
@objc动态变量标题:字符串?
@objc动态变量类别:字符串?
}
公共类Person:对象,可编码{//错误:类型“Person”不符合协议“Encodable”
@objc动态变量名称:字符串?
@objc动态var嗜好:玛丽?
所需的便利性公共初始化(来自解码器:解码器)抛出{
self.init()
let container=try decoder.container(keyedBy:CodingKeys.self)
name=try container.decode(String.self,forKey:.name)
嗜好=尝试容器.decode(rlmaray?.self,forKey:.嗜好)
}
}
func样本(){
让person=try?JSONDecoder().decode(person.self,来自:“{”name\“:\”aaa\“,\”嗜好“:[{”title\“:\”钓鱼“,\”category\“:”户外“},{”title\“:”阅读“,”type\“:”室内“}”。数据(使用:.utf8)!)
印刷品(人)
让realm=try!realm()
试试看!写吧{
realm.add(person!)
}
}
你有什么想法吗

迅捷4
RealmSwift

可编码与可解码+可编码完全相同。如果要符合Codable,则需要实现编码功能,对于Person对象,编码功能将是:

enum CodingKeys: String, CodingKey {
        case name
        case hobbies
// or: case hobbies = "customHobbiesKey" if you want to encode to a different key
}

func encode(to encoder: Encoder) throws {
    do {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(name, forKey: .name)
        try container.encode(hobbies, forKey: .hobbies)
    } catch {
        print(error)
    }
}
将其添加到Person类中,然后为Hobby类实现相同的功能

因为我不确定您是否想要编码:如果您只需要从Json创建领域对象,我只需要用“可解码”协议替换“可编码”

编辑:我注意到问题是关于玛丽的。我不确定codable如何与RLMArray一起工作,但是如果它不工作,您可以尝试用

让爱好=列表()

然后在init()中,将“嗜好”行替换为:

let tempHobbyList: [Hobby] = try container.decode([Hobby].self, forKey: .hobbies)
self.hobbies.append(objectsIn: tempHobbyList)

这就是我如何让我的realmObjects列表与codable一起工作的原因

我只是不想对数据库架构定义和API响应使用同一个类。为什么在这个代码片段中使用
RLMArray
?您的类派生自
对象
,这表明您正在使用领域Swift,因此您应该使用
列表
@EpicPandaForce。最后,我决定分为数据库模式定义和API响应,因为API响应很复杂。非常感谢。@b我错了<代码>列表正确。谢谢你的建议。最后,我决定分为数据库模式定义和API响应,因为API响应很复杂。然而,我很高兴能够得到这个答案。当我使用简单API时,我使用这种方式。非常感谢你。
let tempHobbyList: [Hobby] = try container.decode([Hobby].self, forKey: .hobbies)
self.hobbies.append(objectsIn: tempHobbyList)