UserDefaults 平常我們的項(xiàng)目中都會(huì)用來保存一些賬號(hào)信息等衫贬,但是它的存取需要寫很長的方法調(diào)用马僻,感覺很費(fèi)勁, 而且多人開發(fā)的時(shí)候不利于代碼的統(tǒng)一。
之前從 Apple Sample Code 看到 RawRepresentable 的用法獲得啟發(fā) :
extension UserDefaultNameSpace {
static func namespace<T>(_ key:T) -> String where T :RawRepresentable {
return "\(Self.self).\(key.rawValue) "
}
}
protocol UserDefaultSettable: UserDefaultNameSpace {
associatedtype UserDefaultKey : RawRepresentable
}
之前一直沒用過 RawRepresentable這個(gè)協(xié)議, 通過查看源碼可以發(fā)現(xiàn)(雖然只有三行代碼, 但是注釋卻有很長的一大段, )
public protocol RawRepresentable {
associatedtype RawValue
public init?(rawValue: Self.RawValue)
public var rawValue: Self.RawValue { get }
}
遵循這個(gè)協(xié)議的類型可以表示另一個(gè)類型,并且可以通過 rawValue 這個(gè)屬性得到它表示的值, 看到這里你會(huì)疑問這么寫會(huì)有什么作用, 往下看你就知道了
extension UserDefaultSettable where UserDefaultKey.RawValue == String {}
我們經(jīng)常使用UserDefaults 主要是 Int, String, Any 這幾個(gè)類型
那么可以這樣實(shí)現(xiàn)set方法
extension UserDefaultSettable {
static func set(value:Int, forKey key:UserDefaultKey){
let key = namespace(key)
UserDefaults.standard.set(value, forKey: key)
}
static func integer(forKey key:UserDefaultKey) -> Int {
let key = namespace(key)
return UserDefaults.standard.integer(forKey: key)
}
static func set(value:Any?, forKey key:UserDefaultKey){
let key = namespace(key)
UserDefaults.standard.set(value, forKey: key)
}
static func string(forKey key:UserDefaultKey) -> String? {
let key = namespace(key)
return UserDefaults.standard.string(forKey: key)
}
}
我在處理用戶緩存的時(shí)候, 需要直接把整個(gè)usermodel緩存起來
extension UserDefaults {
//賬號(hào)的信息
struct Account: UserDefaultSettable {
enum UserDefaultKey : String {
case token
case name
case age
// ... 你可以在此自由添加對(duì)應(yīng)模型字段
}
}
// 緩存賬號(hào)信息
class func setUserInfo(userInfo: userInfoModel, token:String) {
UserDefaults.Account.set(value: token, forKey: .token)
UserDefaults.Account.set(value: userInfo.id, forKey: .id)
UserDefaults.Account.set(value: userInfo.nickname, forKey: .nickname)
// ... 你可以在此自由添加對(duì)應(yīng)模型字段
}
// 清除賬號(hào)信息
class func clearUserInfo() {
UserDefaults.Account.set(value: "", forKey: .token)
UserDefaults.Account.set(value: "", forKey: .uid)
UserDefaults.Account.set(value: "", forKey: .pk)
// ... 你可以自由添加對(duì)應(yīng)模型字段
}
}
使用示例
//存:
UserDefaults.setUserInfo(userInfo: (response.returnValue?.info)!, token: token)
//取:
let username = UserDefaults.Account.string(forKey: .userId) ?? ""
以后, 一起開發(fā)的同事們都不會(huì)再為緩存代碼煩惱啦~