我正在使用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
}
答案 0 :(得分:1)
您可以通过将泛型和for i = 1, 10 do
print(mytree['title' .. i])
end
结合使用来实现。它允许您使用通用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<...>