Быстрые кодируемые динамические клавиши для одного объекта - PullRequest
0 голосов
/ 23 сентября 2019

Мой JSON:

    "Filters": [
    { "filter": "View by",
      "products": [
        { "id": 1,
          "views": 56700
        },
        {"id": 2,
          "views": 60000
        }
      ]
    },
    { "filter": "Ordered by",
      "products": [
        { "id": 1,
          "orders": 5600
        },
        { "id": 2,
          "orders": 4300
        }
      ]
    }
  ]

На данный момент для меня работает следующая структура, но ее нелегко использовать

struct Filter: Codable {
    let filter: String
    let products: [[String: Int]]
}

Возможно ли создать структуру общего ключатолько для некоторой части объекта продукта?

Короче говоря, возможно ли применять общую структуру только для "заказов" и "просмотров", а не для идентификатора?

Например: что-то вродеэто

struct Filter: Codable {
    let filter: String
    let products: [Product]
}

struct Product: Codable {
    let id: Int
    let _____: [String: Int] // Some unknown variable
}

1 Ответ

0 голосов
/ 23 сентября 2019

Вы можете написать что-то вроде этого:

protocol Product: Codable {
    var id: Int {get}
}
struct ProductByView: Product {
    let id: Int
    let views: Int
}
struct ProductByOrder: Product {
    let id: Int
    let orders: Int
}

struct Filter: Codable {
    let filter: String
    let products: [Product]

    init(from decoder: Decoder) throws {
        //...
    }

    func encode(to encoder: Encoder) throws {
        //...
    }
}

Но реализация Filter.init(from:) или Filter.encode(to:) будет немного сложной.

В вашем случае вы можете работать с этимупрощенный обходной путь:

struct Product: Codable {
    let id: Int
    let views: Int?
    let orders: Int?
    //... you may need more?
}
struct Filter: Codable {
    let filter: String
    let products: [Product]
}
...