我试图从服务器响应中创建一个自定义对象,该响应具有几个一致的字段以及对象数组。我们称它为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)