在Swift 4中合并领域和可编码类

时间:2018-10-10 14:26:54

标签: json swift realm codable

我正试图一次杀死两只鸟。

我想使用一些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颜色

  

“颜色”类型不符合协议“序列”

可以这样做吗?

2 个答案:

答案 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)
}