如何为自定义DynamicResponse对象的数组字段指定动态泛型类型?
实现泛型DynamicResponse类型
完全可以通过泛型实现你要的效果,让DynamicResponse的数组元素类型支持动态指定,就像Objective-C的Array<Person>那样,同时保证类型安全,不用再手动转换[Any]。
1. 定义泛型结构体
把DynamicResponse定义为泛型类型,将数组元素的类型作为泛型参数:
struct DynamicResponse<T>: Codable where T: Codable { let page: Int let count: Int let objects: [T] }
这里通过where T: Codable约束泛型类型必须遵循Codable协议,方便直接解析服务器返回的JSON数据。
2. 定义对应的业务模型
根据你的示例,先定义两个业务模型:
struct Person: Codable { let name: String let occupation: String } struct StellarObject: Codable { let location: String let inhabitants: Int }
3. 解析不同类型的响应
现在可以直接根据接口返回的类型,指定泛型参数来解析,完全不需要手动转换类型:
// 解析响应A为DynamicResponse<Person> let personResponseData = // 服务器返回的响应A数据 do { let personResponse = try JSONDecoder().decode(DynamicResponse<Person>.self, from: personResponseData) // personResponse.objects 直接是 [Person] 类型,可直接使用 print(personResponse.objects[0].name) } catch { print("解析失败: \(error)") } // 解析响应B为DynamicResponse<StellarObject> let stellarResponseData = // 服务器返回的响应B数据 do { let stellarResponse = try JSONDecoder().decode(DynamicResponse<StellarObject>.self, from: stellarResponseData) // stellarResponse.objects 直接是 [StellarObject] 类型 print(stellarResponse.objects[0].inhabitants) } catch { print("解析失败: \(error)") }
核心优势
- 类型安全:编译期就能检查类型错误,避免运行时的类型转换崩溃
- 代码复用:DynamicResponse的固定字段(page、count)只需要定义一次,无需为每个模型重复写相同结构
- 无需手动转换:objects数组直接是指定的模型类型,不用再从
[Any]强制转换
内容的提问来源于stack exchange,提问作者Stonz2
相关产品推荐
相关产品推荐

