【问题标题】:Swift codable dynamic keys for single entity单个实体的 Swift 可编码动态键
【发布时间】:2020-01-23 02:36:08
【问题描述】:

我的 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]]
}

是否可以仅为产品对象的某些部分创建通用键结构?

简而言之,是否可以仅将通用结构应用于“订单”和“视图”而不应用于 id?

例如:像这样的东西

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

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

【问题讨论】:

  • 你试过了吗??
  • 给出编译器错误“不符合协议'Decodable'
  • 你在哪里资助错误我发现你的例子代码工作正常
  • 其实动态并不是什么关键,只是举例说明。
  • 现在看到我已经更新了代码。

标签: json swift codable


【解决方案1】:

你可以这样写:

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]
}

【讨论】:

    猜你喜欢
    • 2023-03-26
    • 2018-10-27
    • 2019-05-12
    • 2021-05-24
    • 2011-03-26
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多