如何在 swift 中为"ObjectMapper"库创建包装函数



我正在使用ObjectMapper库将我的JSON object映射到Swift object。传统的库方法对我来说很好,就像下面的代码一样。

tmpArray1 = Mapper<UserModel>().mapArray(JSONArray: result1)
tmpArray2 = Mapper<CompanyModel>().mapArray(JSONArray: result2)

现在,我想创建一个通用方法,根据我在该函数中传递的参数返回动态对象。我想要有点像下面。

tmpArray1 = WrapperClass.shared.getModelObject(objType: UserModel, data: Any)
tmpArray2 = WrapperClass.shared.getModelObject(objType: CompanyModel, data: Any)

这是我的WrapperClass.swift类代码:

open class WrapperClass: NSObject {
static let shared = WrapperClass()
open func getModelObject(objType: Mappable, data: Any) -> Any? {
// Need Help Here
return <dynamic object>
}
}

我不知道我的方法是100%正确的,但我想要有点像我在函数的参数中传递的任何对象类型,我想要相同的对象类型作为与ObjectMapper对象映射的回报。我使用的是Swift 4.0版本。

您可以找到ObjectMapper在这里

更新:我尝试过下面的东西,但它不起作用,显示错误

func getModelObject<T: Mappable>(modelType: T.Type, data: Any) -> [T]? {
if data is Array<Any> {
return Mapper<modelType>().mapArray(JSONArray: data as! [[String: Any]])
//ERROR: Use of undeclared type 'modelType'
}
return nil
}

您可以通过泛型和Type的组合来实现这一点。它允许您使用通用T(此处没有Mapper<...>(实例化可映射对象:

func getModelObject<T: Mappable>(objType: T.Type, data: Any) -> T? {
if let data = data as? [String: Any] {
return T(JSON: data)
} else if let data = data as? String {
return T(JSONString: data)
}
return nil
}

用法示例:

class User: Mappable {
var name: String!
var age: Int!
required init?(map: Map) {}
func mapping(map: Map) {
name <- map["name"]
age <- map["age"]
}
}
let json = "{"name":"Bob","age":100}"
if let user = WrapperClass.shared.getModelObject(objType: User.self, data: json) {
print(user.name, user.age)
}

Mapper<...>:回答

func getModelObject<T: Mappable>(data: Any) -> [T]? {
if let data = data as? [[String: Any]] {
return Mapper<T>().mapArray(JSONArray: data)
}
return nil
}

最新更新