我正在编写一个 Swift 应用程序,它具有搜索功能,可以从不同的数据库/源中查找类似的数据。换句话说,这些不同来源的结果应该由相同的模型对象支持。
鉴于每个在线 JSON 源将返回代表相同模型的 JSON 数据,但每个在线源之间的 JSON 略有不同。在不同源之间编码/解码到同一模型的最佳方法是什么?
最佳答案
假设您的通用模型对象需要以下值:(fullName、age)
您有 02 个数据源,它们返回相同信息的类型略有不同:
来源 01
{
"firstName": "John",
"lastName": "Doe",
"age": "25"
}
来源 02
{
"fullName": "Jane Doe"
"dob": "10-02-1990"
}
只要您知道给定的源会产生固定的响应,我就会建议每个响应使用一个模型类,如下所示:
响应01
struct Reponse01: Decodable {
let _firstName: String
let _lastName: String
let _age: Int
}
响应02
struct Reponse02: Decodable {
let _fullName: String
let _dob: Date
}
然后定义一个通用协议(protocol),可用于从您的各个模型结构中提取必要的信息:
protocol BaseModelDerivable {
var fullName: String { get }
var age: Int { get }
}
然后让您的各个响应类实现此接口(interface),同时定义如何返回计算属性的方法。例如:
struct Reponse01: Decodable {
let _firstName: String
let _lastName: String
let _age: Int
}
extension Reponse01: BaseModelDerivable {
var fullName: String {
get { return "\(_firstName) \(_lastName)" }
}
var age: Int {
get { return _age }
}
}
这样,您就可以使用 BaseModelDerivable
拥有不同模型的异构集合。协议(protocol)(在 [BaseModelDerivable]
数组内)。
从某些存储中检索时,您可以通过查询每个单独的项目并将其存储在 [BaseModelDerivable]
中来重新填充此数组。收藏。
注意:虽然可能还有其他方法可以做到这一点,例如创建一个名为 BaseModel
的结构体。并编写多个初始化程序来从这些响应中的任何一个创建该对象,当源很多时,您的模型对象将开始充斥着初始化程序。
struct BaseModel {
let fullName: String
let age: Int
convenience init(aResponse: Response01) {
let fullName = "\(aResponse.firstName) \(aResponse.lastName)"
let age = aResponse.age
init(fullName: fullName, age: age)
}
// another init for Response02
// how many more??
}
注意:您也可以考虑写 Converter<T>
接受任何不同响应并输出 BaseModel
的类值。
有很多方法可以做到这一点。希望这会有所帮助。
关于json - 如何在 Swift 中定义到同一模型对象的不同 JSON 映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57526869/