有時候我們會將一些用戶資訊存在 UserDefaults 裡頭,是個方便且直覺的存取方式。
而 UserDefaults 並非是所有型別都可以接受,如你自己建構的 struct 或 class,
就需要先轉成 Data 的格式來存取。
這邊就來介紹如何存取 User 這個 struct:
struct User {
var ID: String
var name: String
var email: String?
}
這是一個簡單的 User structure,若要轉成 Data 的話,得先將 User 宣告成 Codable,
這樣就可以透過 PropertyListEncoder 和 PropertyListDecoder 來處理 User 和 Data 之間的 encode decode。
而最近喜歡使用 extension 的方式來處理 UserDefaults:
extension UserDefaults {
var user: User? {
get {
guard let data = data(forKey: #function) else { return nil }
return try? PropertyListDecoder().decode(Profile.self, from: data)
}
set {
if let profile = newValue {
set(try? PropertyListEncoder().encode(profile), forKey: #function)
} else {
set(nil, forKey: #function)
}
}
}
}
我們利用 #function 的特性,將 function name (user) 直接作為 UserDefaults 的 key,
再加上一些判斷是否為 nil 的處理,便可以輕鬆底使用 UserDefaults 存取我們所定義的 structure。
存取 UserDefaults 裡頭的 User 就可以變成很單純的 get 和 set:
// get user from UserDefaults
let user = UserDefaults.standard.user
// set user
UserDefaults.standard.user = user