gpt4 book ai didi

ios - ObjectMapper:在映射函数中使用反射

转载 作者:可可西里 更新时间:2023-11-01 01:57:38 24 4
gpt4 key购买 nike

我使用 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 只是一个双元组的类型别名:

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

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

最佳答案

<-运算符声明如下:

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
}

关于ios - ObjectMapper:在映射函数中使用反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50343809/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com