在项目开发之中,你会经常需要将一些数据存储在本地,以便记录用户生产的数据或操作习惯。
在项目文件夹上带点击鼠标右键。弹出右键菜单。
本文将为你演示,存储用户数据的两种常用方式。

选择菜单中的创建新文件选项(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( 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前记得把服务器地址,从测试环境改为生产环境。