KakaJSON可以只用一行代码将常用数据进行归档\解档

  • 后面代码中会用到 file 文件路径
// 文件路径(String或者URL都可以)
let file = "/Users/mj/Desktop/test.data"

String

let string1 = "123"
// 将字符串写入文件
write(string1, to: file) // 从文件中读取字符串
let string2 = read(String.self, from: file)
XCTAssert(string2 == string1) // 从文件中读取Int
XCTAssert(read(Int.self, from: file) == 123)

Date

let date1 = Date(timeIntervalSince1970: 1565922866)
// 将Date写入文件
write(date1, to: file) // 从文件中读取Date
let date2 = read(Date.self, from: file)
XCTAssert(date2 == date1) // 从文件中读取Int
XCTAssert(read(Int.self, from: file) == 1565922866)

Array

let array1 = ["Jack", "Rose"]
// 将数组写入文件
write(array1, to: file) // 从文件中读取数组
let array2 = read([String].self, from: file)
XCTAssert(array2 == array1) // 同样支持Set、Dictionary等

Model

struct Book: Convertible {
var name: String = ""
var price: Double = 0.0
} struct Car: Convertible {
var name: String = ""
var price: Double = 0.0
} struct Dog: Convertible {
var name: String = ""
var age: Int = 0
} struct Person: Convertible {
var name: String = "Jack"
var car: Car? = Car(name: "Bently", price: 106.666)
var books: [Book]? = [
Book(name: "Fast C++", price: 666.6),
Book(name: "Data Structure And Algorithm", price: 666.6),
]
var dogs: [String: Dog]? = [
"dog0": Dog(name: "Wang", age: 5),
"dog1": Dog(name: "ErHa", age: 3),
]
} // 将模型写入文件
write(Person(), to: file) // 从文件中读取模型
let person = read(Person.self, from: file) XCTAssert(person?.name == "Jack")
XCTAssert(person?.car?.name == "Bently")
XCTAssert(person?.car?.price == 106.666)
XCTAssert(person?.books?.count == 2)
XCTAssert(person?.dogs?.count == 2)

Model Array

struct Car: Convertible {
var name: String = ""
var price: Double = 0.0
} let models1 = [
Car(name: "BMW", price: 100.0),
Car(name: "Audi", price: 70.0)
]
// 将模型数组写入文件
write(models1, to: file) // 从文件中读取模型数组
let models2 = read([Car].self, from: file)
XCTAssert(models2?.count == models1.count)
XCTAssert(models2?[0].name == "BMW")
XCTAssert(models2?[0].price == 100.0)
XCTAssert(models2?[1].name == "Audi")
XCTAssert(models2?[1].price == 70.0)

Model Set

struct Car: Convertible, Hashable {
var name: String = ""
var price: Double = 0.0
} let models1: Set<Car> = [
Car(name: "BMW", price: 100.0),
Car(name: "Audi", price: 70.0)
] // 将模型Set写入文件
write(models1, to: file) // 从文件中读取模型Set
let models2 = read(Set<Car>.self, from: file)!
XCTAssert(models2.count == models1.count)
for car in models2 {
XCTAssert(["BMW", "Audi"].contains(car.name))
XCTAssert([100.0, 70.0].contains(car.price))
}

Model Dictionary

struct Car: Convertible {
var name: String = ""
var price: Double = 0.0
} let models1 = [
"car0": Car(name: "BMW", price: 100.0),
"car1": Car(name: "Audi", price: 70.0)
] // 将模型字典写入文件
write(models1, to: file) // 从文件中读取模型字典
let models2 = read([String: Car].self, from: file)
XCTAssert(models2?.count == models1.count) let car0 = models2?["car0"]
XCTAssert(car0?.name == "BMW")
XCTAssert(car0?.price == 100.0) let car1 = models2?["car1"]
XCTAssert(car1?.name == "Audi")
XCTAssert(car1?.price == 70.0)

【KakaJSON手册】07_Coding_归档_解档的更多相关文章

  1. OC对象的归档及解档浅析

    一般用在用户登录,保存这个用户的信息 对象归档,就是把内存中对象持久化. 对象解档,就是把持久化的对象读取到内存. oc中对象归档解档大致分为以下几种方法: 从数量上可以分为: 对单个对象归档解档 对 ...

  2. iOS开发——UI进阶篇(十一)应用沙盒,归档,解档,偏好设置,plist存储,NSData,自定义对象归档解档

    1.iOS应用数据存储的常用方式XML属性列表(plist)归档Preference(偏好设置)NSKeyedArchiver归档(NSCoding)SQLite3 Core Data 2.应用沙盒每 ...

  3. iOS 自定义的对象类型的解档和归档

    自定义的对象的解档和归档 如果想对自己自定义的类进行解档和归档的话 必须遵循一个协议:NSCoding Student.h 文件 #import <Foundation/Foundation.h ...

  4. iOS开发中的4种数据持久化方式【一、属性列表与归档解档】

    iOS中的永久存储,也就是在关机重新启动设备,或者关闭应用时,不会丢失数据.在实际开发应用时,往往需要持久存储数据的,这样用户才能在对应用进行操作后,再次启动能看到自己更改的结果与痕迹.ios开发中, ...

  5. iOS 浅复制、深复制、完全复制的知识点梳理验证(附加归档解档)

    在之前转载的一片文章中,文中对浅复制和深复制进行了详细的解读,同时还提到了深复制(one-level-deep copy).完全复制(true copy)的概念,并指出iOS开发中的深复制是单层深赋值 ...

  6. 数据存储之归档解档 NSKeyedArchiver NSKeyedUnarchiver

    在构建应用程序时,有一个重要的问题是如何在每次启动之间持久化数据,以便重现最后一次关闭应用前的状态.在iOS和OS X上,苹果提供了三种选择:Core Data.属性列表(Property List) ...

  7. iOS 浅赋值、深复制、全然复制的知识点梳理验证(附加归档解档)

    写于前: 在之前转载的一片文章中.文中对浅复制和深复制进行了具体的解读,同一时候还提到了深复制(one-level-deep copy).全然复制(true copy)的概念,并指出iOS开发中的深复 ...

  8. IOS数据存储之归档/解档

    前言: 前天学习了NSUserDefaults,我们知道NSUserDefaults不能保存自定义对象,所以我们今天来认识一下归档(NSKeyedArchiver)和解档(NSKeyedUnarchi ...

  9. IOS s数据存储之归档解档

    #import <Foundation/Foundation.h> @interface Student : NSObject <NSCoding>; @property(no ...

随机推荐

  1. Linux运维技术之yum与rpm的基本使用要点

    https://pkgs.org/ 与https://rpmfind.org/   RPM包下载 RPM包简介 1.安装与升级时,使用的是包全名 2.RPM包安装时要注意包的依赖性 RPM包操作(系统 ...

  2. 轻量级C#编辑器RoslynPad((基于Roslyn编译器))

    简介 RoslynPad是一个Apache 2.0协议开源的轻量级C#编辑器.支持自动完成,语法提示,修改建议等功能.很适合平时随手写个C#程序看看运行结果. 目前版本:0.10.1,无需保存也可以运 ...

  3. GhostScript命令参数详解(转)

    http://blog.csdn.net/catoop/article/details/42737441 本文列出几个常用参数,然后下面附上官方的参数详解: 一.常用参数解释 这是一个测试的命令:gs ...

  4. js--同步运动json上

    如何实现几个属性的同时变化?这个问题需要运用到json,这里我们先来简要的介绍一下json json的形式是这样的,他的元素是有一对对的键值对组成的{name1:value1,name2:value2 ...

  5. 为什么在 Java 中128==128返回false,而127==127返回true呢?

    为什么在 Java 中128==128返回false,而127==127返回true呢? 有这样一段代码 Integer a=127; Integer b=127; System.out.printl ...

  6. 18-Flutter移动电商实战-首页_火爆专区商品接口制作

    1.获取接口的方法 在service/service_method.dart里制作方法.我们先不接收参数,先把接口调通. Future getHomePageBeloConten() async{   ...

  7. Sam小结和模板

    Sam 的一些总结 注意在子串在某个节点的性质,其 father 上也会有相同的性质 1. 统计子串出现的次数 在 \(parent\) 树上做 \(dp\),对于每一个节点,初始化为 \(dp[i] ...

  8. [RN] React Native 滚动跳转到指定位置

    React Native 滚动跳转到指定位置 一.结构 <ScrollView horizontal={true} ref={(view) => { this.myScrollView = ...

  9. 洛谷 P5614题解

    吐槽:数据好像有点水,直接枚举到200可以得80 points. 另:我还是太弱了,比赛的时候只有90 points,#7死卡不过去,最后发现是没有判断 \(z_1\) 和 \(z_2\) 的范围-- ...

  10. mac 以多tab的方式打开

    让mac 始终以多tab的方式打开程序 背景: 开发中始终需要多个 项目 的方式进行处理, 但一直使用 `command + `` 的方式总是比较烦人, 有没有一个比较好的视图方式呢; 即我想在一个窗 ...