如何在Swift中为“ ObjectMapper”库创建包装函数

时间:2018-07-19 12:53:02

标签: ios iphone swift object 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
}

1 个答案:

答案 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<...>