首页 > 解决方案 > 在 Swift 4 中合并 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)")
        }
}

然后我更新了我的我更新了我的颜色类以符合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颜色

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

这可能吗?

标签: jsonswiftrealmcodable

解决方案


替换这个

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


推荐阅读