这里执行两项任务:
1。将字典转换为模型对象
2.将模型对象转换为字典
删除以下代码并使其正常工作:
JsonMapper.Swift
class JsonMapper
{
/**
*@Method : decodeUser
*@Param : Dictionary of type [String:Any]
*@ReturnType : User ( which is model )
*@Description: Responsible for mapping Dictionary to Model object
*/
func decodeUser(userDict:[String:Any]) -> User?
{
let decoder = JSONDecoder()
var objUser: User?
do {
let jsonData = try JSONSerialization.data(withJSONObject: userDict, options: JSONSerialization.WritingOptions.prettyPrinted)
objUser = try decoder.decode(User.self, from: jsonData)
print("✅ User Object: \n",objUser)
} catch {
print("❌ Error",error)
}
return objUser ?? User(id: "", type: “”,salary:””)
}
/**
*@Method : encodeUser
*@Param : User
*@ReturnType : Dictionary of type [String:Any]
*@Description: Responsible for mapping Model object User to Dictionary
*/
func encodeUser(modelObj:User) -> [String:Any]
{
let encoder = JSONEncoder()
var objProfileDict = [String:Any]()
do {
let data = try encoder.encode(modelObj)
objUserDict = (try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any])!
print("✅ json dictionary: \n",objProfileDict)
}
catch {
print("❌ Error \(error)")
}
return objUserDict
}
}
用户模型:
struct User:Codable
{
let id : String
let type : String
let salary : String
}
上面的代码运行正常,没问题。
现在的问题是: 1.每当我需要将Dictionary转换为任何模型时,在这里您都可以看到Model User是固定的,因此我想将上述代码转换为通用模型,这样,我将传递任何模型,然后返回结果。
当我通过Dictionary时,它应该返回我将在运行时指定的模型,我希望对每个模型都使用此通用名称,以便Dictionary可以转换为任何指定的模型。
请提供您宝贵的意见。
**注意: 1,不想使用任何第三方库,例如ObjectMapper等。
答案 0 :(得分:1)
这里的名称INSERT
具有误导性。您真正的意思是字典映射器。您的方法很好。如果您希望它是通用的,只需传递类型。我可能会这样:
JsonMapper
extension JSONDecoder {
/**
*@Method : decodeUser
*@Param : Dictionary of type [String:Any]
*@ReturnType : User ( which is model )
*@Description: Responsible for mapping Dictionary to Model object
*/
func decode<T: Decodable>(_ type: T.Type, from dictionary: [String: Any]) throws -> T
{
let jsonData = try JSONSerialization.data(withJSONObject: dictionary)
return try decode(T.self, from: jsonData)
}
}
也是如此。