有時候我們會將一些用戶資訊存在 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