UserDefault 设置默认值

417 阅读2分钟

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新知”,每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!