【问题标题】:ObjectMapper: Using reflection in map functionObjectMapper:在映射函数中使用反射
【发布时间】:2018-05-15 06:42:45
【问题描述】:

我使用ObjectMapper有一段时间了,我发现使用文档中描述的方式为具有大量属性的类编写映射函数很麻烦:

func mapping(map: Map) {
    username    <- map["username"]
    age         <- map["age"]
    weight      <- map["weight"]
    array       <- map["array"]
    dictionary  <- map["dictionary"]
    bestFriend  <- map["bestFriend"]
    friends     <- map["friends"]
}

我想知道是否可以使用反射来编写如下映射函数,假设我的 JSON 数据和我的类具有完全相同的属性名称:

func mapping(map: Map) {
    let names = Mirror(reflecting: self).children.flatMap { $0.label }
    for name in names {
        self.value(forKey: name) <- map[name]
    }
}

更新:

根据 Sweeper 的回答,我更新了我的代码:

func mapping(map: Map) {
    for child in Mirror(reflecting: self).children.compactMap({$0}) {
        child <- map[child.label]
    }
}

我想这应该可行。

更新 2:

感谢 Sweeper,我发现我最初的猜测是错误的,Child 只是一个 touple 的类型别名:

public typealias Child = (label: String?, value: Any)

所以我的第二次尝试也行不通。

【问题讨论】:

  • 您知道在 Swift 4 中您可以使用 Codable 并在您的特定情况下为您处理一切吗?
  • 我知道Codable,但 ObjectMapper 提供了更多功能,所以我更喜欢只使用它。
  • 我更喜欢 github.com/Ahmed-Ali/JSONExport 创建可映射的 swift 类

标签: ios swift reflection objectmapper


【解决方案1】:

&lt;- 运算符声明如下:

public func <- <T: RawRepresentable>(left: inout T, right: Map) {
    left <- (right, EnumTransform())
}

如您所见,左边的参数声明为inout。这意味着您必须在那里使用可变变量,而不是某些方法的返回值。

所以你确实需要编写所有属性。

我找到了这个为你生成映射的插件:https://github.com/liyanhuadev/ObjectMapper-Plugin

在 Swift 4 中,Codable 被引入并自动为您解决问题:

struct Foo: Codable {
    var username: String
    var age: Int
    var weight: Double

    // everything is done for you already! You don't need to write anything else
}

【讨论】:

  • @OlcayErtaş 我怀疑这也行得通……是吗? child 只是实际属性的副本。对其进行变异不会影响实际属性。
  • 那么在 Swift 反射中,没有办法通过名称来获取实际属性吗?
  • @OlcayErtaş 您可以通过名称获取属性的值,但是很难更改属性的值。我发现了这个:stackoverflow.com/questions/31589405/… 您可能可以使用 Object Mapper 来完成这项工作,但它真的脆弱且丑陋。你有点失去了使用 Object Mapper 的全部意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-25
  • 2015-11-27
  • 2015-05-18
  • 1970-01-01
  • 2017-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多