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



我试图从服务器响应中创建一个自定义对象,该响应具有几个一致的字段以及对象数组。我们称它为DynamicResponse。对于任何单独的DynamicResponse,该数组中的对象将是某些自定义对象的相同类型,但不同的DynamicResponse对象将具有不同类型的自定义对象。下面是我试图解释的例子。

在声明DynamicResponse对象时,是否有一种方法可以在DynamicResponse中积极地键入数组?就像我们创建一个数组对象并定义该数组中对象的类型一样,我想创建一个DynamicResponse对象并在该对象的自定义变量中定义对象的类型。现在我有数组类型为[Any],然后必须根据使用的端点来强制转换它。类似于Objective-C做Array<Person>之类的事情,我希望能够创建一个DynamicResponse<Person>来指示DynamicResponse中的自定义数组将是Person类型。有办法做到这一点吗?


例子

反应:

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

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

将数组的类型作为类型参数约束为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)

相关内容

  • 没有找到相关文章

最新更新