【问题标题】:How to create a wrapper function for "ObjectMapper" library in swift如何在 swift 中为“ObjectMapper”库创建包装函数
【发布时间】:2018-07-19 12:53:01
【问题描述】:

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

【问题讨论】:

  • 在 Swift 4 中,ObjectMapper 实际上已经过时,取而代之的是内置的Codable 协议。

标签: ios iphone swift object objectmapper


【解决方案1】:

您可以通过结合泛型和Type 来实现。它允许您使用通用 T 实例化可映射对象(此处没有 Mapper&lt;...&gt;):

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&lt;...&gt;:

func getModelObject<T: Mappable>(data: Any) -> [T]? {
    if let data = data as? [[String: Any]] {
        return Mapper<T>().mapArray(JSONArray: data)
    }
    return nil
}

【讨论】:

  • func getModelObject&lt;T: Mappable&gt;(modelType: T.Type, data: Any) -&gt; T? { if data is Array&lt;Any&gt; { return Mapper&lt;modelType&gt;().mapArray(JSONArray: data as! [[String: Any]]) } return nil } 我正在这样做,但它显示错误Use of undeclared type 'modelType'
  • @iOS.Wolf,在我的回答中,我不通过Mapper 使用init。再检查一遍。
  • 但我想要一个从Mapper 映射的对象。检查我更新的问题。
猜你喜欢
  • 2012-03-20
  • 2021-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多