[Swift4.2互动教程]七、常见概念-(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前记得把服务器地址,从测试环境改为生产环境。

原文地址:https://www.cnblogs.com/strengthen/p/9771989.html

时间: 2024-08-27 18:33:38

[Swift4.2互动教程]七、常见概念-(10)使用UserDefaults和归档方式存取用户数据的相关文章

[Swift4.2互动教程]七、常见概念 - (2)点CGPoint和变形CGAffineTransform的使用

本文将为你演示点对象CGPoint的使用,其中CG表示来自CoreGraphic(核心图形)这个跨平台框架 首先导入需要使用的两个框架第一个框架表示界面工具框架第二个框架表示核心绘图和动画框架 1 import UIKit 2 import QuartzCore 定义一个点对象,并设置它的位置为原点.从右侧的结果可以看出,原点的x和y值都是0 let zeroPoint = CGPoint.zero 初始化另一个点对象 var point = CGPoint() 接着查看点对象的坐标值,从右侧的

[Swift4.2互动教程]七、常见概念 - (3)尺寸CGSize的使用详解

本文将为你演示CGSize的使用 首先导入需要使用到的两个框架 1 import UIKit 2 import QuartzCore 定义一个尺寸对象,尺寸对象包含宽度和和高度两个参数.从右侧的结果可以看出,此时该尺寸对象的宽度和高度都是0 let zeroSize = CGSize.zero 初始化另一个尺寸对象,并设置它的宽度为20,高度为10 let size = CGSize(width: 20, height: 10) 查看该尺寸对象的高度和宽度的数值 1 size.width 2 s

[Swift4.2互动教程]七、常见概念-(6)日期Date和DateFormatter日期的格式化

本文将为你演示日期类型的使用,以及如何对日期进行格式化. 首先引入需要使用到的界面框架 import UIKit 初始化一个日期对象,它的值和当前电脑中的日期相同 var date = Date() 获得当前60分钟之后的时间 date.addTimeInterval(60 * 60) 获得当前60分钟之后的时间,并存储再一个常量之中. let sencondDate = date.addTimeInterval(60 * 60) 对两个时间进行比较,当时间小于进行比较的时间时,返回值为-1.比

[Swift4.2互动教程]七、常见概念-(12)使用DispatchGroup(调度组)管理线程数组

本文将为你演示调度组的使用,使用调度组可以将多个线程中的人物进行组合管理,可以设置当多个相同层次的任务完成之后,再执行另一项任务. 首先导入需要使用的界面工具框架 import UIKit 在控制台输出一条日志语句,表示调试任务开始执行 print("Start the task and display teh Loading animation.") 接着初始化一个调度组对象. let gro =DispatchGroup() 同时运行多个任务,每个任务的启动时间是按照加入队列的顺序

[Swift4.2互动教程]七、常见概念-(13)使用UIScreen查询设备屏幕信息

本文将为你演示,如何获得设备的屏幕信息,了解设备的屏幕尺寸等信息,才能做出适配性更好的应用程序. 首先导入需要使用到的界面工具框架 import UIKit 然后通过UIScreen类,就可以获得设备的屏幕信息.这里获得设备的屏幕尺寸,点击显示结果图标,查看获得的结果 UIScreen.main.availableModes.description 从结果列表中可以看出,屏幕的宽度为2048像素,高度为1536像素.再次点击结果图标,关闭结果列表. [<UIScreenMode: ox60000

[Swift4.2互动教程]八、实用进阶-(6)通过属性进行对象间的消息传递

本文将演示,如何通过一个对象作为另一个对象的属性,从而通过设置属性的值,来实现对象之间的消息传递.首先打开自定义视图的代码文件(CustomView.swift) 1 import UIKit 2 //使当前的自定义类,遵循文本输入框代理协议 3 class CustomView: UIView,UITextFieldDelegate{ 4 //给自定义类添加一个文本框类型的属性 5 var textField: UITextField! 6 //添加一个视图控制器类的属性,并设置类型为弱引用,

SEO教程——SEO的主动访问用户数据

对于SEO来说,最终目的是为了用户能主动访问你的网页,而技巧和手段都知识过渡.今天的SEO教程我们就来讨论一下什么是SEO的主动访问用户数据,又有什么意义. 1.搜索引擎在对站点进行评级时会考虑到主动访问用户数据 2.主动访问用户数据可以帮助搜索引擎正确认识一个站点. 大家都知道搜索引擎喜欢原创内容占比高的网站,对于站外重复度较高的网站持谨慎观望的态度.有些网站没有原创能力,却可以通过编辑网络上的信息把一个主题内容做大做全,从而HOLD住大批目标用户,主动访问用户能够达到一定比例.对于这样的非原

《互动教程 for Photoshop CC》已成功发布在App Store

不看视频不看书,超级好玩的PS教程! App store下载量超百万! 超千份来自世界各地用户的五星好评以及诚意推荐! 单击.双击.长按.拖动及各种快捷键,就像您在真正的Photoshop上操作一样! 比观看视频.阅读书籍更加有效.有趣! 指尖点亮设计之源!哪里不会戳哪里,妈妈再也不会担心我的Ps了! 一起动手来戳Photoshop吧! App Store免费下载地址: https://itunes.apple.com/cn/app/hu-dong-jiao-cheng-for-photosho

Swift中文教程(七)--协议,扩展和泛型

Protocols and Extensions 协议(接口)和扩展 Swift使用关键字protocol声明一个协议(接口): 类(classes),枚举(enumerations)和结构(structs)都可采用协议(protocol): 1 class SimpleClass: ExampleProtocol { 2 var simpleDescription: String = "A very simple class." 3 var anotherProperty: Int