我正在使用ObjectMapper将数据映射到我的模型,我需要在我的模型中填充一个 email 属性。棘手的部分是,根据用户注册的方式(使用email或使用Facebook/Google帐户),保存嵌套 email 属性的密钥将反映他们的注册选择。我将在下面给出我的 JSON 数据示例。
在常规电子邮件注册的情况下:
"local": {
"email": "[email protected]",
"password": "$2a$10$ZqqsS5F1QXmoEXnwL3v2sAxES",
"passwordConf": "$2a$10$ZqqzsLfQXmoEXnwL3v2sAxES"
}
在常规 Facebook 或谷歌注册的情况下:
"facebook": {
"id": "10287",
"email": "[email protected]"
}
"google": {
"id": "11514716",
"email": "[email protected]"
}
你明白了。正如您所看到的,密钥必须不同才能匹配 3 个选项(本地、facebook 或 google)之一,以便通过获取电子邮件进行访问。这个问题的一种解决方案是使用枚举。我将发布我的模型的相关部分。
import ObjectMapper
struct Client: Mappable {
enum EmailType: String {
case local = "local"
case facebook = "facebook"
case google = "google"
}
var emailType: String?
init?(map: Map) {}
mutating func mapping(map: Map) {
emailType <- map["\(EmailType.RawValue()).email"]
}
这个想法是使用字符串插值,所以它会找到与上面枚举的匹配项。该.email可以让我获得了嵌套属性。这似乎是一个合乎逻辑的解决方案,但它为 emailType 属性返回nil,所以很明显它没有正确映射它。
现在您已经看到了我的 JSON 和我的数据模型,您认为访问 email 属性的最佳方式是什么,无论它具有哪种类型的键。如果可能,我想避免为 local、fb 和 google 创建 3 个属性,我希望它简洁但动态。谢谢你的帮助!
您想要实现的目标我建议创建单独的模型类,因为它很容易为将来的更新进行修改
你所做的不正确。您刚刚创建EmailType
的RawValue
对象,它将始终返回空
emailType <- map["\(EmailType.RawValue()).email"]
如果你打印
print("\(EmailType.RawValue()).email")
你得到的输出是
。电子邮件
我对Map
仍然没有更好的主意你需要的是告诉尝试每个枚举案例以获取数据
我的建议是,你需要检查nil
的emailType
字符串
试试这个代码
emailType <- (map["\(EmailType.local).email"] ?? map["\(EmailType. facebook).email"] || map["\(EmailType. google).email"] )
希望对你有帮助
编辑\更新
我做了研究Mappble
,发现以下对你有帮助
您收到错误,因为Map
没有返回非可选值。所以要摆脱它,你需要使用map.JSON
if map.JSON[EmailType.local.rawValue] != nil {
emailType <- (map["\(EmailType.local).email"] )
} else if map.JSON[EmailType.facebook.rawValue] != nil {
emailType <- (map["\(EmailType.facebook).email"] )
} else if map.JSON[EmailType. google.rawValue] != nil {
emailType <- (map["\(EmailType.google).email"] )
}
如果您仍然遇到问题,请告诉我。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句