json 自定义对象中的动态变量数组类型

vbkedwbf  于 2022-11-19  发布在  其他
关注(0)|答案(1)|浏览(114)

我试图从一个服务器响应中创建一个自定义对象,它有几个一致的字段和一个对象数组。让我们称之为DynamicResponse。对于任何一个DynamicResponse,数组中的对象将是相同类型的某个自定义对象,但不同的DynamicResponse对象将有不同类型的自定义对象。下面是我试图解释的示例。
当声明一个DynamicResponse对象时,有没有一种方法可以在DynamicResponse中确定数组的类型?这与我们创建一个数组对象并在该数组中定义对象的类型非常相似。我想创建一个DynamicResponse对象,并在该对象的自定义变量中定义对象的类型。现在,我将数组的类型设置为[Any],然后必须根据使用的端点对其进行强制转换。我希望能够创建一个DynamicResponse<Person>来指示DynamicResponse中的自定义数组将是Person类型。有办法做到这一点吗?
范例
回答A:

{
  page: 1,
  count: 26,
  objects: [
    {
      name: "bob",
      occupation: "builder"
    },
    {
      name: "walt",
      occupation: "welder"
    },
    ...
  ]
}

回答B:

{
  page: 2,
  count: 99,
  objects: [
    {
      location: "Earth",
      inhabitants: 8000000000
    },
    {
      location: "Mars",
      inhabitants: 0
    },
    ...
  ]
}

所以第一个DynamicResponse

page: Int
count: Int
objects: [Person]

第二个DynamicResponse

page: Int
count: Int
objects: [StellarObject]

除自定义对象数组中的对象类型外,所有字段均保持一致。

mwkjh3gx

mwkjh3gx1#

只要将数组的型别设为型别参数,并限制为Codable即可:

struct DynamicResponse<Item: Codable>: Codable {
    let page: Int
    let count: Int
    let objects: [Item]
}

然后你可以做:

let decoder = JSONDecoder()
// if you expect to get a person response
let personResponse = try decoder.decode(DynamicResponse<Person>.self, from: data)
// if you expect to get a stellar object response
let stellarObjectResponse = try decoder.decode(DynamicResponse<StellarObject>.self, from: data)

相关问题