我正试图一次杀死两只鸟。
我想使用一些JSON数据并将其保存到Realm数据库中。
这是我的JSON数据
{ "Colors":
[ {"Name" : "Blue"},
{"Name" : "Red"},
{"Name" : "Green"},
{"Name" : "Black"}
]
}
我已经有一个Realm类,可以正常工作。
class Color : Object {
//RealmObject
@objc dynamic var name : String = ""
}
当我使用它
import SwiftyJSON
import RealmSwift
func process(jsonData: JSON) {
for color in jsonData.arrayValue {
let c = Color()
c.name = color["Name"]
save(data: c)
}
}
func save(data: Object){
do{
try realm.write {
realm.add(data)
}
} catch {
print("Error saving data: \(error)")
}
}
然后我更新了我的Color类,使其符合Codable
class Color : Object, Codable {
//RealmObject
@objc dynamic var name : String = ""
//Codable For JSON Deserialziation
enum CodingKeys: String, CodingKey {
case name = "Name"
}
}
struct Colors: Codable {
let colors: [Color]
enum CodingKeys: String, CodingKey {
case colors = "Colors"
}
}
我想对编码jsonData并将其保存到Realm的效果做些什么。
if let colors = try? JSONDecoder().decode(Colors.self, from: data.rawData()) {
self.save(data: colors)
}
但是我似乎无法正常工作。我尝试了多种方法来获取错误:
无法转换“颜色”类型的值?预期参数类型 “对象”
或者尝试for
颜色
“颜色”类型不符合协议“序列”
可以这样做吗?
答案 0 :(得分:1)
替换此
self.save(data: colors)
使用
colors.colors.forEach { self.save(data:$0) }
此处为colors
if let colors = try? JSONDecoder().decode(Colors.self, from: data.rawData()) {---}
是一个对象,其中包含类型为colors
的数组属性Color
答案 1 :(得分:1)
问题在于colors
的类型为Colors
,它不是Object
的子类,但是它的属性为[Color]
。您要么需要遍历该属性并分别保存每个对象,要么更好的是,重载save
以处理Object
子类实例的数组。
func save<T:Object>(objects: [T]){
do{
try realm.write {
realm.add(objects)
}
} catch {
print("Error saving data: \(error)")
}
}
然后保存对象:
if let colors = try? JSONDecoder().decode(Colors.self, from: data.rawData()) {
self.save(objects: colors.colors)
}