博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Swift 之 Codable
阅读量:5959 次
发布时间:2019-06-19

本文共 2954 字,大约阅读时间需要 9 分钟。

自从Swift 4.0 之后取代HandyJSON 的原生解析model 的类

关于 官方文档

/// A type that can convert itself into and out of an external representation.////// `Codable` is a type alias for the `Encodable` and `Decodable` protocols./// When you use `Codable` as a type or a generic constraint, it matches/// any type that conforms to both protocols.public typealias Codable = Decodable & Encodable复制代码

Codable 是一个可以编码 和解码的 协议 当你使用Codable 做为一个类型或 泛型约束 它可以匹配任何 符合协议的类型

用法

Model

struct AutionListModel: Codable {	let status: Int	let message: String	let data: [Datum]}struct Datum: Codable {	let sheng, projectID, projectType, status: Int	let nowMoney: String	let project: Project	let shi: Int	let updatedAt, endTime, openingBid: String	let type, participation, id, xian: Int	let jiaoTime: String	let yanNum, yanQi: Int	let randNum: JSONNull?	let cashDeposit: String	let winID: Int?	let deadline, closingCost, markUp, startTime: String	let xiang: Int	let createdAt: String	let lookNum: Int		enum CodingKeys: String, CodingKey {		case sheng		case projectID = "projectId"		case projectType, status, nowMoney, project, shi		case updatedAt = "updated_at"		case endTime, openingBid, type, participation, id, xian, jiaoTime, yanNum, yanQi, randNum, cashDeposit		case winID = "winId"		case deadline, closingCost, markUp, startTime, xiang		case createdAt = "created_at"		case lookNum	}}struct Project: Codable {	let xian, title: String	let thumb: String	let lookNum: Int	let sheng, juli: String}有些字段可能为空值 所以不确定是否有值的时候声明为可选值(?)复制代码

自定义键名

当后台返回的字段和系统关键字冲突的时候 或者key 不匹配的时候

enum CodingKeys: String, CodingKey {		case sheng		case projectID = "projectId"		case projectType, status, nowMoney, project, shi		case updatedAt = "updated_at"		case endTime, openingBid, type, participation, id, xian, jiaoTime, yanNum, yanQi, randNum, cashDeposit		case winID = "winId"		case deadline, closingCost, markUp, startTime, xiang		case createdAt = "created_at"		case lookNum	}复制代码

不确定数据类型的解析

声明一个跨类型解析类TStrInt: 新手 我也没太懂 怎么回事

一个含有int,string的类,可用于解析后台返回类型不确定的字段。

即:把int\string解析成TStrInt且解析后TStrInt的int和string都有值

struct TStrInt: Codable {    var int:Int {        didSet {            let stringValue = String(int)            if  stringValue != string {                string = stringValue            }        }    }        var string:String {        didSet {            if let intValue = Int(string), intValue != int {                int = intValue            }        }    }        //自定义解码(通过覆盖默认方法实现)    init(from decoder: Decoder) throws {        let singleValueContainer = try decoder.singleValueContainer()                if let stringValue = try? singleValueContainer.decode(String.self)        {            string = stringValue            int = Int(stringValue) ?? 0                    } else if let intValue = try? singleValueContainer.decode(Int.self)        {            int = intValue            string = String(intValue);        } else        {            int = 0            string = ""        }    }}复制代码

转载地址:http://awfax.baihongyu.com/

你可能感兴趣的文章
Vuex学习
查看>>
bootstrap - navbar
查看>>
切图崽的自我修养-[ES6] 编程风格规范
查看>>
服务器迁移小记
查看>>
FastDFS存储服务器部署
查看>>
Android — 创建和修改 Fragment 的方法及相关注意事项
查看>>
swift基础之_swift调用OC/OC调用swift
查看>>
Devexpress 15.1.8 Breaking Changes
查看>>
Java B2B2C多用户商城 springcloud架构- common-service 项目构建过程(七)
查看>>
杨老师课堂之ArrayList集合常用方法解析
查看>>
ElasticSearch Client详解
查看>>
新零售讲堂之时代下的传统零售业,何去何从?
查看>>
c++读取和写入TXT文件的整理
查看>>
linux安全问答(1)
查看>>
mybatis update返回值的意义
查看>>
expdp 详解及实例
查看>>
解读最具O2O属性—哈根达斯微信企业号的成功之道
查看>>
Extjs4.x (MVC)Controller中refs以及Ext.ComponentQuery解析
查看>>
Server-01 How to Find the Remote Desktop Port
查看>>
Java--接口、抽象与继承
查看>>