★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公眾號:山青詠芝(let_us_code)
➤博客園地址:山青詠芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https:////www.cnblogs.com/strengthen/p/12382032.html
➤原文已修改更新!強烈建議點擊原文地址閱讀!支持作者!支持原創!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
曾幾何時,在 Swift 中對 JSON 數據轉數據模型的操作十分棘手,我們不得不給 Model 添加 @objc 標識,然后利用 JSONModel、MJExtension、YYModel 等這些傳統的 OC 庫來進行轉換。但是這么做就無法使用 struct 作為 Model,無法 Swift 中 struct 低內存占用、無內存泄露風險、線程安全、寫時復制等眾多特性。
於是催生了 SwiftyJSON、HandyJSON 等優秀的三方庫,到了 Swift4 , Codable 拯救了世界。不過由於 Codable 對類型推斷的支持不是十分到位,於是有了今天的主角:Codextended
由於 SwiftyJSON 語法比較怪異,相對而言 HandyJSON 就十分的友好,使用起來不需要太多額外操作,轉好的 Model 可以直接打點調用屬性取值。
HandyJSON 和 Codextended 之間的差異:
- HandyJSON 是直接利用內存布局對 Model 中的屬性進行賦值。Codextended 只是對 Codable 的封裝。
- 對泛型的支持。其實二者都支持泛型,只是當泛型類型為數組時,HandyJSON 無法進行解析,這一點不知道后面會不會有改進。
- Model 中的默認值:Codable 不支持默認值,Model 中的可選類型屬性沒有在 JSON 中找到對應 key 時,會被置為 nil,遇到必須值沒有對應 key 時,直接拋出異常。HandyJSON 的處理是,必選值需要有默認值,或者在 Model 的初始化方法中賦值,當 JSON 數據中沒有對應 key 時,直接取默認值。實際開發場景中,這兩種處理方式各有優缺點,大家可以根據需求來選擇。
- 類型轉換(兼容):Codable 不支持類型兼容,定義了 Int 類型的屬性,如果 JSON 中對應的值為 String 則直接拋出異常,HandyJSON 中會做轉換。這個場景平常遇到的會多一些。
這里我比較推薦 Codextended,基於官方的 Codable 進行包裝,后續 Codable 有性能改進可以直接享受到提升,HandyJSON 在使用過程中稍微有點繁瑣,但也相對比較靈活。另外關於默認值這個設定,我覺得有點爭議,只能說仁者見仁智者見智吧。