如何为 swift 中的 "ObjectMapper" 库创建包装函数
How to create a wrapper function for "ObjectMapper" library in swift
我正在使用 ObjectMapper 库将我的 JSON object
映射到 Swift object
。传统的图书馆方法对我来说效果很好,如下面的代码。
tmpArray1 = Mapper<UserModel>().mapArray(JSONArray: result1)
tmpArray2 = Mapper<CompanyModel>().mapArray(JSONArray: result2)
现在,我想根据传入该函数的参数为 return 动态对象创建一个通用方法。我想要的有点像下面。
tmpArray1 = WrapperClass.shared.getModelObject(objType: UserModel, data: Any)
tmpArray2 = WrapperClass.shared.getModelObject(objType: CompanyModel, data: Any)
这是我的 WrapperClass.swift
class 代码:
open class WrapperClass: NSObject {
static let shared = WrapperClass()
open func getModelObject(objType: Mappable, data: Any) -> Any? {
// Need Help Here
return <dynamic object>
}
}
我不知道我的方法是 100% 正确的,但我想要有点像我在函数的参数中传递的任何对象类型我想要 return 中的相同对象类型映射到 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
}
我正在使用 ObjectMapper 库将我的 JSON object
映射到 Swift object
。传统的图书馆方法对我来说效果很好,如下面的代码。
tmpArray1 = Mapper<UserModel>().mapArray(JSONArray: result1)
tmpArray2 = Mapper<CompanyModel>().mapArray(JSONArray: result2)
现在,我想根据传入该函数的参数为 return 动态对象创建一个通用方法。我想要的有点像下面。
tmpArray1 = WrapperClass.shared.getModelObject(objType: UserModel, data: Any)
tmpArray2 = WrapperClass.shared.getModelObject(objType: CompanyModel, data: Any)
这是我的 WrapperClass.swift
class 代码:
open class WrapperClass: NSObject {
static let shared = WrapperClass()
open func getModelObject(objType: Mappable, data: Any) -> Any? {
// Need Help Here
return <dynamic object>
}
}
我不知道我的方法是 100% 正确的,但我想要有点像我在函数的参数中传递的任何对象类型我想要 return 中的相同对象类型映射到 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
}