之前使用UserDefaults代码是这样的
private let kString1 = "kString1"
private let kString2 = "kString2"
UserDefaults.standard.set("string1", forKey: kString1)
UserDefaults.standard.set("string2", forKey: kString2)
UserDefaults.standard.string(forKey: kString1)
UserDefaults.standard.string(forKey: kString1)
缺点:如果存储的变量或对象很多,key写起来很繁琐。
在FFExtension中,我用#function作为key的默认名称,这样就省去了一堆繁琐的代码。并且给其配置默认值,而且当值设置为nil时,UserDeufaults将去除这对(key: value),代码如下:
public var FFDUserDefaults = UserDefaults.standard
// MARK: Set Get string for key
func ffd_setString(_ newValue: String?, key: String = #function) {
guard let value = newValue else { FFDUserDefaults.removeObject(forKey: forKey); return }
FFDUserDefaults.set(value, forKey: forKey)
}
func ffd_stringForKey(_ key: String = #function, defaultValue: String? = nil) -> String? {
if (defaultValue != nil) && ffd_objectForKey(key) == nil { return defaultValue! }
return FFDUserDefaults.string(forKey: key)
}
// MARK: Set Get object for key
func ffd_setObject(_ newValue: AnyObject?, key: String = #function) {
FFDUserDefaults.ffd_set(newValue, key: key)
}
func ffd_objectForKey(_ key: String = #function, defaultValue: AnyObject? = nil) -> AnyObject? {
if (defaultValue != nil) && ffd_objectForKey(key) == nil { return defaultValue }
return FFDUserDefaults.object(forKey: key) as AnyObject?
}
使用的时候,只需要预先给变量设置如下get,set方法,这里就没有繁琐的key需要设置,也可以设置默认值
var string1: String? {
get { return FFDUserDefaults.ffd_stringForKey() }
set { FFDUserDefaults.ffd_setString(newValue) }
}
var string2: String? {
get { return FFDUserDefaults.ffd_stringForKey(defaultValue: "defaultValueString") }
set { FFDUserDefaults.ffd_setString(newValue) }
}
调用时候只需要如下操作即可
/// 设置并存储string1, string2的值
FFDUserDefaults.string1 = "string1"
FFDUserDefaults.string2 = "string2"
/// 获取string1, string2 的值
let _ = FFDUserDefaults.string1
let _ = FFDUserDefaults.string2
FFDExtension 还对Bool, Array, Dictionary,URL, Data等类型进行了处理
附DEMO
网友评论