如何为 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
}