UserDefaults
在 iOS 开发中,存储数据有多种方式,但 UserDefaults (OC 里的 NSUserDefaults) 是使用最简单的。
它只能存储基本数据类型,适合存储一些小数据,多用于保存用户对应用程序行为的首选项,例如字体大小、声音禁用/启用,Face ID 是否开启之类的。
有的时候,你可能希望用 UserDefaults 存储的值在存储之前有个默认值,今天我们就来探讨一下这个问题。
基本使用方法
假设你的应用程序允许用户设置视频播放时是否打开声音,这个值如果用户没有主动设置过,默认为开的状态。
在首次调用之前你可以这么做:
let userDefaults = UserDefaults.standard
if userDefaults.value(forKey: "enabledSound") == nil {
userDefaults.set(true, forKey: "enabledSound")
}
先创建 userDefaults 对象,然后获取 enabledSound 的值,如果为 nil,证明没有设置过,就把这个值设置为 true,注意这里用的是 userDefaults.value(forKey: "enabledSound"),而不是 userDefaults.bool(forKey: "enabledSound"), 因为后者默认返回 false。
这么做确实能够实现我们的需求,但是代码会有点奇怪。
更好的做法
其实 UserDefaults 是支持设置默认值的,打开 UserDefaults 的声明文件,可以看到一个 register 方法
/**
-registerDefaults: adds the registrationDictionary to the last item in every search list.
This means that after NSUserDefaults has looked for a value in every other valid location,
it will look in registered defaults, making them useful as a "fallback" value.
Registered defaults are never stored between runs of an application,
and are visible only to the application that registers them.
Default values from Defaults Configuration Files will automatically be registered.
*/
open func register(defaults registrationDictionary: [String : Any])
简单来说就是可以通过这个方法来给 NSUserDefaults 的 key 设置默认值(如果没有设置过的话)。
那我们尝试通过这个方法为 enabledSound 设置默认值:
let userDefaults = UserDefaults.standard
userDefaults.register(
defaults: [
"enabledSound": true
]
)
设置完成之后我们第一次尝试获取 enabledSound 的值就为 true 了。
print(userDefaults.bool(forKey: "enabledSound"))
// 打印 true
这里的例子是个 bool 值,也可以设置为其他基本数据类型,比如字典:
let userDefaults = UserDefaults.standard
userDefaults.register(
defaults: [
"userInfo": ["userID": 10000, "userName": "iOS 新知"] as [String : Any]
]
)
print(userDefaults.dictionary(forKey: "userInfo")!)
// 打印 ["userName": iOS 新知, "userID": 10000]
点击下方公众号卡片,关注我,每天分享一个关于 iOS 的新知识
本文同步自微信公众号 “iOS新知”,每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!