前言
最近要新搞一个项目, 然后选定了数据库用 RealmSwift, Model 和 JSON 互转用 HandyJSON
这两个合起来用( 准确来说, 只是HandyJSON本身的问题 ), 引发了一个问题, JSON 转 Model 的时候, Model 值一直不出来
后来, 经过一系列排查, 才找到问题所在( 表面问题, 没去看源码 ), 然后也算半解决状态了吧
坑
HandyJSON 版本: 5.0.0
Swift 版本: 5.0
我目前的解决方法,有两个, 都不是很好, 不过抛转引玉, 肯定会有更好的方法的 ( 如广大网友, 有更好的方法, 可以留言 )
示例 JSON 为
{
"Name":"老王"
}
先放一开始的代码
// 继承 RealmSwift 的 Object, 并且遵守 HandyJSON 协议
class XQTestModel: Object, HandyJSON {
@objc dynamic var xq_name: String?
func mapping(mapper: HelpingMapper) {
// Name 映射为 xq_name
mapper <<<
self.xq_name <-- "Name"
}
}
很简单的代码, 就是把 Name 映射为 xq_name, 但转换时, 却为空 =_=
排查
有问题, 那肯定有解决办法. 那么, 就进入排查阶段. ( 说一下思路,不喜的, 直接跳过 )
RealmSwift 和 HandyJson 一起用的时候, 转换不了. 平常就不会, 那么, 我们从用了 RealmSwift 之后, 会有那些不一样的地方开始排查
-
Object
类 , 不用 RealmSwift 的 Object, 换成系统的 NSObject, 结果不行, 排除 ( 这里就可以看出, 其实跟 RealmSwift 无太大关系了 ) -
@objc
删除之后, 还是不行, 排除 -
dynamic
删除之后, 可以了. 那么可以先缩小范围在 dynamic 上 -
mapping
保持存有 dynamic 字段, 把 xq_name 改回和 JSON 一致 Name, 然后移除 mapping 内容.
结果是可以的.
那么先知道了, 映射字段 和 dynamic 这两个问题所在, 就能离答案更进一步了. 起码现在知道, 单纯只是 HandyJSON 自己不支持 dynamic 和 mapping 混用. 不要错怪了 RealmSwift
最后想来想去, 就想到以下两个方法解决.( 感觉算不上解决方案 ?, 其实最好还是去看 mapping 源码, 估计是这一块出了问题 )
ps: GitHub 上也有人提了, 不过 HandyJSON 的大佬一直没去解决 ㄟ( ▔, ▔ )ㄏ
解决办法1: 直接用后台传来的 Key
如果你并不介意直接用后台传来的key, 那么就可以直接声明
@objc dynamic Name: String?
这样就算有 dynamic, 也是可以用的. 当然, 如果你愿意这样, 那么也不会来寻求答案, 那么可以看看第二种
解决办法1: 利用 willSet
代码如下
class XQTestModel: NSObject, HandyJSON {
required override init() {
super.init()
}
@objc private var Name: String?
{
willSet {
xq_name = newValue
}
}
@objc dynamic var xq_name: String?
}
这个方法虽然有点蠢, 主要代码量太大,但是起码能解决目前的问题.
ps: 如有更好的方法, 请告诉我, 因为我也不想再用这么蠢的方法了 (╯﹏╰)