使用可解码的领域快速列表



我正在尝试弄清楚如何使用Swift 4中的新功能,可解码协议中的新功能。

这是一个示例JSON:

  [{
     "name": "Jack",
     "lastName": "Sparrow",
     "number": "1",
     "address": [
        {
           "city": "New York",
           "street": "av. test"
        }
     ]
  },
  {
     "name": "Cody",
     "lastName": "Black",
     "number": "2"
  },
  {
     "name": "Name",
     "lastName": "LastName",
     "number": "4",
     "address": [
        {
           "city": "Berlin",
           "street": "av. test2"
        },
        {
           "city": "Minsk",
           "street": "av. test3"
        }
     ]
  }]

和领域模型:

public final class Person: Object, Decodable {
    @objc dynamic var name = ""
    @objc dynamic var lastName = ""
    var address = List<Place>()
    override public static func primaryKey() -> String? {
        return "lastName"
    }
    private enum CodingKeys: String, CodingKey { case name, lastName, address}
    convenience public init(from decoder: Decoder) throws {
        self.init()
        let container = try decoder.container(keyedBy: CodingKeys.self)
        self.name = try container.decode(String.self, forKey: .name)
        self.lastName = try container.decode(String.self, forKey: .lastName)
        self.address = try container.decodeIfPresent(List<Place>.self, forKey: .address) ?? List()
    }
}

place

public final class Place: Object, Decodable {
    @objc dynamic var city = ""
    @objc dynamic var street = 0
    override public static func primaryKey() -> String? {
        return "street"
    }
 // We dont need to implement coding keys becouse there is nothing optional and the model is not expanded by extra properties.   
}

解析此JSON的结果是:

[Person {
    name = Jack;
    lastName = Sparrow;
    number = 1;
    address = List<Place> <0x6080002496c0> (
    );
}, Person {
    name = Cody;
    lastName = Black;
    number = 2;
    address = List<Place> <0x6080002496c0> (
    );
}, Person {
    name = Name;
    lastName = LastName;
    number = 4;
    address = List<Place> <0x6080002496c0> (
    );

我们可以看到我们的列表总是空的。

self.address = try container.decodeIfPresent(List<Place>.self, forKey: .address) ?? List()

将永远是nil

也是我正在扩展List by:

extension List: Decodable {
    public convenience init(from decoder: Decoder) throws {
        self.init()
    }
}

有什么想法可能出了什么问题?

编辑

struct LoginJSON: Decodable {
    let token: String
    let firstCustomArrayOfObjects: [FirstCustomArrayOfObjects]
    let secondCustomArrayOfObjects: [SecondCustomArrayOfObjects]
    let preferences: Preferences
    let person: [Person]
}

每个属性(而不是令牌)是一种Realm Object,最后一个是从上方的。

谢谢!

您不能直接从JSON转到列表。JSON中的是 array 。因此,这条线无法正常工作:

self.address = try container.decodeIfPresent(List<Place>.self, forKey: .address) ?? List()

您必须从获取数组开始:

if let arr = try container.decodeIfPresent(Array<Place>.self, forKey: .address) {
    // arr is now an array of Place
    self.address = // make a List from `arr`, however one does that
} else {
    self.address = nil
}

相关内容

  • 没有找到相关文章

最新更新