swift - 通用解码功能不起作用(Swift)
问题描述
我正在尝试创建一个通用解码函数来解码我的两个不同模型。我收到错误“参数类型'PrivateSchoolType.Type'不符合预期的类型'Decodable'”。
模型
struct PrivateSchoolModel: Decodable {
var name: String
var id: String
var city: String
var state: String
}
调用函数
function getInfo() {
// does not work => ERROR
guard let schools = decode(jsonData: jsonData, using: PrivateSchoolModel) else { return }
// does work
guard let schools = specificDecode()
}
特定的解码功能(DOES WORK)
private func specificDecode() -> [PrivateSchoolModel]? {
guard let jsonData = getJSONData(from: .privateSchool) else { return }
do {
let decoder = JSONDecoder()
let schools = try decoder.decode([PrivateSchoolModel].self, from:
jsonData)
return schools
} catch let error {
print("Error: \(error.localizedDescription)")
}
return nil
}
通用解码功能(不工作)
private func decode<M: Decodable>(jsonData: Data, using model: M) -> [M]? {
do {
//here dataResponse received from a network request
let decoder = JSONDecoder()
let schools = try decoder.decode([M].self, from:
jsonData) //Decode JSON Response Data
return schools
} catch let parsingError {
print("Error", parsingError)
}
return nil
}
解决方案
改变方法signature
如下,
private func decode<M: Decodable>(jsonData: Data, using modelType: M.Type) -> M? {
do {
//here dataResponse received from a network request
let decoder = JSONDecoder()
let schools = try decoder.decode(modelType, from: jsonData) //Decode JSON Response Data
return schools
} catch let parsingError {
print("Error", parsingError)
}
return nil
}
用法
guard let schools = decode(jsonData: jsonData, using: [PublicSchoolModel].self) else { return }
推荐阅读
- svn - Subversion: Can I tell the conflict resolver, to look for structural changes not on the incomig, but on the local files?
- android - React Native 构建在 android 中失败,@react-native-community/cli-platform-android /native_modules.gradle' 行:130
- hadoop - Application Master UI 未打开,Web 代理无法正常工作
- javascript - asp.net核心缺少javascript文件路由问题
- c++ - 如何覆盖继承的嵌套类中存在的虚拟方法
- regex - 排除正则表达式中的字符串 - PCRE 格式
- wordpress - 重力形式通知未发送
- java - 为什么 android.content.res.Resources$NotFoundException: 文件 res/drawable/ 低于 API 21
- c++ - NTTP 的结构类型:为什么所有成员都必须公开?
- tensorflow - 调用 tf.image.non_max_suppression 时获取 ValueError