我正在使用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
}