• Swift使用编解码库Codable


    Codable 是 Swift 引入的全新的编解码库,使开发者更方便的解析JSON 或 plist 文件。支持枚举、结构体和类。

    Codable协议定义

    Codable代表一个同时符合 Decodable 和 Encodable 协议的类型,即可解码且可编码的类型。

    1. typealias Codable = Decodable & Encodable
    2. public protocol Decodable {
    3. public init(from decoder: Decoder) throws
    4. }
    5. public protocol Encodable {
    6. public func encode(to encoder: Encoder) throws
    7. }

    Codable从 Swift 4 开始引入,包含了 Encoder 和 Decoder 协议和他们的两个实现 JSONEncoder、JSONDecoder 和 PropertyListEncoder、PropertyListDecoder。

    其中 Codable 及其相关协议放在了标准库中,而具体的 Encoder、Decoder 类放在了 Foundation 框架中。 

    JSON 和 模型的相互转换

    苹果提供了 JSONEncoder 和 JSONDecoder 这两个结构体来方便得在 JSON 数据和自定义模型之间互相转换。苹果可以利用一些系统私有的机制来实现转换,而不需要通过 OC Runtime

    只要让自己的数据类型符合 Codable 协议,就可以用系统提供的编解码器进行编解码。

    1. struct User: Codable {
    2. var name: String
    3. var age: Int
    4. }
    解码(JSON Data -> Model):
    let user = JSONDecoder().decode(User.self, from: jsonData)
    
    编码(Model -> JSON Data):
    let jsonData = JSONEncoder().encode(user)
    

    字典 和 模型的相互转换

    将模型用JSONEncoder的encode转成Data,然后再用JSONSerialization反序列化成Dictionary对象。

    1. struct User: Codable {
    2. var name: String?
    3. var age: Int?
    4. static func convertFromDict(dict: NSDictionary) -> User? {
    5. var user: User?
    6. do {
    7. let data = try JSONSerialization.data(withJSONObject: dict, options: [])
    8. let decoder = JSONDecoder()
    9. user = try decoder.decode(User.self, from: data)
    10. } catch {
    11. print(error)
    12. }
    13. return user
    14. }
    15. func convertToDict() -> NSDictionary? {
    16. var dict: NSDictionary?
    17. do {
    18. let encoder = JSONEncoder()
    19. let data = try encoder.encode(self)
    20. dict = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? NSDictionary
    21. } catch {
    22. print(error)
    23. }
    24. return dict
    25. }
    26. }

    可选链中的问号(?)和叹号(!)区别

    obj.school!.dept!.name

    使用感叹号(!)访问时,一旦链条某些环节没有值,程序就会发生异常。

    obj.school?.dept?.name

    使用问号(?)访问时,当某些环节没有值的时候返回nil,程序不会发生异常。 

  • 相关阅读:
    聚观早报 |OPPO Reno11系列官宣;荣耀100系列渲染图
    【延展Extension的基本使用 Objective-C语言】
    SpringBoot跨域问题
    Vue.js核心技术解析与uni-app跨平台实战开发学习笔记 第6章 Vue.js路由 6.3 路由重定向以及动画路由 && 6.4 路由传参
    经典网络解析(三)GoogleNet | Inception块,1*1卷积核,辅助分类器 整体结构代码
    java下标索引异常
    [汇编语言]更灵活的定位内存地址的方法
    【ARM CoreLink 系列 2 -- CCI-400 控制器简介】
    apache paimon在flink中做维表join的优势
    继承的构造函数
  • 原文地址:https://blog.csdn.net/watson2017/article/details/132759245