[Swift实际操作]七、常见概念,10使用UserDefaults和归档方式存取用户数据实际操作

热烈欢迎,请直接点击!!!

进入博主App Store主页,下载使用各个作品!!!

注:博主将坚持每月上线一个新app!!!

在项目开发之中,你会经常需要将一些数据存储在本地,以便记录用户生产的数据或操作习惯。

在项目文件夹上带点击鼠标右键。弹出右键菜单。

本文将为你演示,存储用户数据的两种常用方式。

选择菜单中的创建新文件选项(New File),创建一个类文件,用来存档用户数据。

在弹出的文件模板选择窗口中,保持默认的选项(Cocoa Touch Class),然后点击下一步按钮,进入下一步设置页面。

在类名输入框内输入类的名称。

Class: Person

接着输入父类的名称。

Subclass of: NSObject

语言默认选择。

Language: Swift

点击下一步按钮,进入下一步设置页面。

保持默认的文件存储位置,点击创建按钮,完成文件的创建。

接着编写代码,完成该类文件。

 1 import UIKit
 2 /*给类添加一个NSCoding协议,它通过扩展你的数据类,以支持编码和解码功能。
 3 它的任务就是把数据写到数据缓存,最后持久保存到磁盘中。
 4 */
 5 class Person:NSObject,NSCoding
 6 {
 7    //给类添加一个字符串类型的属性
 8    var name: String
 9    //添加一个初始化方法,用来设置属性的值
10    required init(name: String = "")
11    {
12      self.name = name
13     }
14    //添加一个协议中的初始化方法
15    //用来实现类的实例的解码操作
16    required init(coder decoder: NSCoder)
17    {
18       self.name = decoder.decodeObject(forKey: "Name") as? String ?? ""
19     }
20     //实现协议中的方法,用来实现类的实例的编码操作。
21     func encode(with coder: NSCoder)
22     {
23         coder.encode(name, forKey: "Name")
24     }
25 }

然后在左侧的项目导航区,打开视图控制器(ViewController.swift)的代码文件。

现在开始编写代码,实现数据的存储和归档。

UserDefaults类用于保存应用程序的设置和属性以及用户数据,

存储在defaults中的数据,在整个应用程序的生命周期中都是可以随时调用的。

let userDefault = UserDefaults.standard

通过set方法,存储一个指定键的整形值

userDefault.set(35, forKey: "MyAge")

通过synchronize(同步)方法,把数据持久化到数据库

userDefault.synchronize()

当需要获取存储的数据时,通过指定的键获得存储的数据。

userDefault.integer(forKey: "MyAge")

通过设置方法,存储一个指定键的浮点类型的值。

1 userDefault.set(78.5, forKey: "Percentage")
2 //把数据持久化到数据库
3 userDefault.synchronize()
4 //通过指定的键获得存储的浮点类型数据
5 userDefault.float(forKey: "Percentage")

使用相同的方式存储其他的数据

1 userDefault.set(3.141592658, forKey: "PI")
2 //把数据持久化到数据库
3 userDefault.synchronize()
4 //通过指定的键获得存储的双精度类型的浮点数据
5 userDefault.double(forKey: "PI")

同样可以存储布尔类型的数据

1 userDefault.set(true, forKey: "IsPassed")
2 //把数据持久化到数据库
3 userDefault.synchronize()
4 //通过指定的键获得存储的布尔类型的数据
5 userDefault.bool(forKey: "IsPassed")

往指定的键中存储一个网址类型的数据

1 userDefault.set(URL(string:"https://www.cnblogs.com/strengthen/")!, forKey: "URL")
2 //把数据持久化到数据库
3 userDefault.synchronize()
4 //通过指定的键获得存储的双精度类型的浮点数据
5 userDefault.url(forKey: "URL")!

存储、持久化和读取字符串类型的数据

1 userDefault.set("strengthen", forKey: "MyName")
2 userDefault.synchronize()
3 userDefault.string(forKey: "MyName")

即使是数组也可以使用这种方式进行存储和读取的。

1 userDefault.set(["Xcode","Swift"], forKey: "Language")
2 userDefault.synchronize()
3 userDefault.array(forKey:"Language") as! [String]

存储和读取指定键的字典对象

1 userDefault.set(["Name":"strengthen"], forKey: "User")
2 userDefault.synchronize()
3 userDefault.dictionary(forKey:"User") as! [String : String]

使用删除对象方法,删除指定键下的内容

1 userDefault.removeObject(forKey: "User")
2 userDefault.synchronize()

此时再获取该键对应的值时,将返回空

userDefault.dictionary(forKey:"User") ?? ""

接着演示如何归档一个对象的实例,首先初始化一个类的实例对象,

并设置实例对象的属性的值

1 Let person = Person()
2 person.name = "smith"

然后通过归档数据方法,将符合NSCoding协议的对象进行归档

let personData = NSKeyedArchiver.archivedData(withRootObject: person)

调用synchronize(同步)方法,持久化存储内容

userDefault.synchronize()

将归档对象存储再指定的键中

userDefault.set(personData, forKey: "Teacher")

通过data方法,获得指定键的二进制内容。

let data = userDefault.data(forKey: "Teacher")

然后对该二进制数据进行解码,并转换位指定的类型

let teacher = NSKeyedUnarchiver.unarchiveObject(with: data!) as! Person

输出对象名称的属性的值

print(teacher.name)

技巧:如果有后台服务器,打包IPA前记得把服务器地址,从测试环境改为生产环境。