[Swift实际操作]七、常见概念-(10)使用UserDefaults和归档方式存取用户数据实际操作
在项目开发之中,你会经常需要将一些数据存储在本地,以便记录用户生产的数据或操作习惯。
在项目文件夹上带点击鼠标右键。弹出右键菜单。
本文将为你演示,存储用户数据的两种常用方式。
选择菜单中的创建新文件选项(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前记得把服务器地址,从测试环境改为生产环境。