代码之家  ›  专栏  ›  技术社区  ›  user-44651

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

  •  0
  • user-44651  · 技术社区  · 8 年前

    我正试着用一门课杀死两只鸟。

    我想使用一些JSON数据并将其保存到领域数据库中。

    { "Colors": 
        [   {"Name" : "Blue"},
            {"Name" : "Red"},
            {"Name" : "Green"},
            {"Name" : "Black"}
        ]
    }
    

    我已经有一个领域类,工作良好。

    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进行编码并将其保存到领域。

    if let colors = try? JSONDecoder().decode(Colors.self, from: data.rawData()) {
       self.save(data: colors)
    }
    

    但我似乎无法让它工作。我尝试了多种方法来获得错误:

    '对象'

    或者试图 for

    类型“Colors”不符合协议“Sequence”

    2 回复  |  直到 8 年前
        1
  •  1
  •   Dávid Pásztor    8 年前

    问题是 colors 属于类型 Colors ,这不是 Object 子类,但它具有类型的属性 [Color] . 您需要遍历属性并单独保存每个对象,或者更好的方法是重载 save 处理数组 对象 子类实例。

    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)
    }
    
        2
  •  1
  •   Shehata Gamal    8 年前

    替换此

    self.save(data: colors)
    

    colors.colors.forEach { self.save(data:$0) }
    

    colors 在这里

    if let colors = try? JSONDecoder().decode(Colors.self, from: data.rawData()) {---}
    

    是包含数组属性的对象 颜色 类型 Color