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)