我正在使用ObjectMapper将数据映射到我的模型,我需要在模型中填充一个电子邮件属性。棘手的部分在于,取决于用户如何注册(无论是用电子邮件注册,还是使用帐户注册),持有嵌套电子邮件属性的密钥将反映他们的注册选择。下面我将给出一个JSON数据的示例。
就定期电子邮件登记而言:
"local": {
"email": "testclient1@mail.com",
"password": "$2a$10$ZqqsS5F1QXmoEXnwL3v2sAxES",
"passwordConf": "$2a$10$ZqqzsLfQXmoEXnwL3v2sAxES"
}就Facebook或google的常规注册而言:
"facebook": {
"id": "10287",
"email": "jcstclair@icloud.com"
}
"google": {
"id": "11514716",
"email": "parkhomeyp@gmail.com"
}你明白了吧。正如您所看到的,为了在get电子邮件中访问,键必须是不同的,才能匹配3种选择(本地的、facebook的或谷歌的)。解决这个问题的一个办法是使用枚举。我会贴出我的模型的相关部分。
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零,因此很明显,它没有正确地映射它。
现在您已经看到了我的JSON和我的数据模型,您认为访问email属性的最佳方法是什么,不管它有哪种类型的密钥。我想避免为本地,fb和谷歌创建3个属性,如果可能的话,我希望它是简洁的,但动态的。谢谢你的帮助!
发布于 2018-01-08 09:16:10
我建议创建单独的模型类,因为将来的更新很容易修改。
你所做的不对。您刚刚创建了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"] )
}如果你还面临问题,请告诉我。
https://stackoverflow.com/questions/48145463
复制相似问题