NSCoding

这种方式是OC中就有的,比较老的方式,并且使用限制是只能是calss,然后实现NSCoding,对于struct是不能使用的。

internal func encode(with aCoder: NSCoder) {var count :UInt32 = 0if let ivar = class_copyIvarList(self.classForCoder, &count) {for i in 0..<Int(count) {let iv = ivar[i]//获取成员变量的名称 -> c语言字符串if let cName = ivar_getName(iv) {//转换成String字符串guard let strName = String(cString: cName, encoding: String.Encoding.utf8) else{//继续下一次遍历continue}//利用kvc 取值let value = self.value(forKey: strName)aCoder.encode(value, forKey: strName)}}// 释放c 语言对象free(ivar)}}internal required init?(coder aDecoder: NSCoder) {super.init()var count :UInt32 = 0if let ivar = class_copyIvarList(self.classForCoder, &count) {for i in 0..<Int(count) {let iv = ivar[i]//获取成员变量的名称 -》 c语言字符串if let cName = ivar_getName(iv) {//转换成String字符串guard let strName = String(cString: cName, encoding: String.Encoding.utf8) else{//继续下一次遍历continue}//进行解档取值let value = aDecoder.decodeObject(forKey: strName)//利用kvc给属性赋值setValue(value, forKeyPath: strName)}}// 释放c 语言对象free(ivar)}}
复制代码

利用运行时设置好属性,这样又多了一层限制,必须继承NSObject,因为运行时只有继承NSObject才会具备。如果不介意手动一行一行设置属性,那大可不继承NSObject。

static func saveCustomObject(customObject object: NSCoding, key: String) {let encodedObject = NSKeyedArchiver.archivedData(withRootObject: object)self.userDefaults.set(encodedObject, forKey: key)self.userDefaults.synchronize()}static func removeCustomObject(key: String) {self.userDefaults.removeObject(forKey: key)}static func getCustomObject(forKey key: String) -> Any? {if let decodedObject = self.userDefaults.object(forKey: key), let data = decodedObject as? Data {let object = NSKeyedUnarchiver.unarchiveObject(with: data)return object}return nil}
复制代码

这样就把class归档,解档做好了,对于struct的归档必须使用取巧的方式参考这里或者这里面,NSCoding只适用于class,系统并没有提供专门的针对struct的解归档的协议.

Swift4.0后Codable

Swift4.0后解归档就变得容易多了Codable,这个协议对于class或是struct都适用,并且使用起来很简单方便。

class ClassA: Codable {private var message : String? = "message"private var nu : String? = "nu"private var condition : String? = "condition"var com : String? = "com"var status : String? = "status"var state : String? = "state"var data : [ClassB]? = []
}struct ClassB: Codable{var time : String? = "time"var ftime : String? = "ftime"var context : String? = "context"var location : String? = "location"
}
复制代码

定义class和struct,只要声明实现Codable协议,不需要做额外的其他操作,比如不需要手动添加设置解归档的key等等。系统都会帮你搞定。不过需要注意的是Codable并不支持继承方式的子类解归档,也就是如果ClassC继承ClassA,如果对ClassC解归档时不会成功的,也就是说Codable不能够被继承使用,所以只能在子类实现Codable,父类不去实现Codable。

let a = ClassA()let b = ClassB()a.data = [b]//归档let encoder = JSONEncoder()if let data = try? encoder.encode(a) {print(String(data: data, encoding: .utf8)!)UserDefaults.standard.set(data, forKey: "piaojin")}let object = UserDefaults.standard.object(forKey: "piaojin")//解档let decoder = JSONDecoder()if let data = object as? Data {let objectA = try? decoder.decode(ClassA.self, from: data)print("\(String(describing: objectA))")}
复制代码

这样就搞定了,关于Codable的详细介绍可以参考这里和这里。

Swift class和struct的解归档相关推荐

  1. (15)System Verilog结构体struct详解

    (15)System Verilog结构体struct详解 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog结构体struct详解 5) ...

  2. archive 归档解归档

    1.需要启动yarn进程 $>start-yarn.sh 2.归档文件 archive 一般将一些小文件归档成一个xxx.har的大文件夹,该文件夹下有相应的数据文件. xxx.har目录是一个 ...

  3. Swift - SwiftyJSON的使用详解(附样例,用于JSON数据处理)

    转自:http://www.hangge.com/blog/cache/detail_968.html Swift - SwiftyJSON的使用详解(附样例,用于JSON数据处理) 2016-01- ...

  4. Swift 5新特性详解:ABI 稳定终于来了!

    近日,苹果开发者博客更新了一篇关于Swift 5的文章,带来了Swift 5新特性的消息,其中最受开发期待的莫过于iOS 12.2将带来ABI 稳定性,这意味着基础库将植入系统中,不再包含在App中, ...

  5. Swift基础(六)解包

    // 解包(if let语句和 guard语句)         // 1. if let 可选类型在每次访问的时候都会提取并检测他的值是否存在,但有时候根据程序结构可以推断可选量在首次赋值后必然存在 ...

  6. C/C++结构体struct详解

    结构体定义 typedefstruct 用法详解和用法小结 typedef是类型定义的意思.typedef struct 是为了使用这个结构体方便. 具体区别在于: 若struct node{}这样来 ...

  7. Swift 5 Type Metadata 详解

    背景 Swift 5 出了,主要是 ABI 稳定了,从 ABI Dashboard 来看为了解决 ABI 稳定问题,对 type metadata 也有不少改动.众所周知,我们 App 的 JSON ...

  8. Swift 中的关键字详解

    转载自:https://www.cnblogs.com/liYongJun0526/p/7522130.html 要学习Swift这门语言,就必须先了解Swift的关键字及对应的解释.这里就列一下在S ...

  9. C语言结构体struct详解

    目录 一.struct的概念 1.类比: 2.含义详解: 二.结构体变量的定义 1.创建结构体类型的时候定义 2.具体使用的时候定义 三.如何得到结构体成员? 1.通过 . 点操作符得到结构体成员 2 ...

最新文章

  1. 全球气候变迁 物联网技术为农业保驾护航
  2. python成长之路9——文件操作open
  3. VUE工程跨域的配置
  4. 超有用的 java面试题
  5. 信息技术上册教案了解计算机,信息技术上册全册教案
  6. js打开、关闭页面和运行代码那些事
  7. 微软发布 Autodesk FBX 漏洞带外安全公告,将于5月推出补丁
  8. C/C++全局变量和局部变量作用域问题
  9. 最新高清IT职业技能图谱(15图)
  10. linux设备驱动程序架构的研究,Linux设备驱动程序学习(12)-Linux设备模型(底层原理简介)...
  11. poj 2513 欧拉回路+并查集推断是否联通+Trie树
  12. h264 ES流文件通过计算first_mb_in_slice区分帧边界
  13. 封装,继承,多态的理解
  14. COPYPASTE: AN AUGMENTATION METHOD FOR SPEECH EMOTION RECOGNITION -论文阅读
  15. 计算机windows用户名密码怎么查,如何查看Windows和Office的密码、序列号
  16. Compiere 开源CRM的比较选择
  17. 计算机组成原理复习笔记——二、数据的表示和运算
  18. 有c语言基础自学JAVA要多久,零基础学java需要多久?要先学习C语言吗?
  19. Kafka 与 RabbitMQ 如何选择使用哪个?
  20. java开发环境变量的配置

热门文章

  1. WPF: 使用CommandManager.InvalidateRequerySuggested手动更新Command状态
  2. c# 关于WebBrowser的模拟提交InvokeMember方法是什么意思!
  3. java中ArrayList用法详解,基本用法(含增删改查)
  4. scrapy newspaper bug
  5. 记录一次docker项目连接不上docker mysql的问题
  6. js中当等于最小值是让代码不执行_从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理...
  7. cmake取消宏定义_Excel基础丨取消excel中宏安全提示框
  8. 计算机上网络接口层,2016计算机专业知识:TCP/IP 各层功能
  9. php微信拍照图库js接口,ThinkPHP微信实例——JSSDK图像接口多张图片上传下载并将图片流写入本地...
  10. php this validate,php扩展ZF——Validate扩展