UserDefaults with Structure

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