前言
最近要新搞一個項目, 然後選定了數據庫用 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: 如有更好的方法, 請告訴我, 因爲我也不想再用這麼蠢的方法了 (╯﹏╰)